Forwarded from عکس نگار
Please open Telegram to view this post
VIEW IN TELEGRAM
چند ثانیه سریعتر، یک تجربه متفاوت: افزایش سرعت سرویس ثبت آگهی، رضایت کاربران و درآمد!
این مطلب از وبلاگ مهندسی دیوار در وب سایت ویرگول برداشته شده است . آدرس اصلی مقاله : yun.ir/divar01
سال ۱۴۰۱، سرویس ثبت آگهی دیوار، یکی از حیاتیترین بخشهای پلتفرم، با چالشهای فزایندهای روبرو بود. با رشد دیوار و افزایش روزانهی تعداد آگهیها، زیرساخت قدیمی که با پایتون نوشته شده بود، دیگر پاسخگوی نیازهای ما نبود. کاربران هنگام ثبت آگهی با کندی و خطا مواجه میشدند و این موضوع مستقیماً بر تجربهی آنها و در نتیجه بر موفقیت دیوار تأثیر میگذاشت.
تیم فنی تصمیم گرفت برای حل ریشهای این مشکلات، سرویس ثبت آگهی را بازنویسی کند. هدف اصلی بهبود پایداری (Reliability) و سرعت سرویس بود، اما نتیجهی کار، یک غافلگیری خوشایند برای همه ما به همراه داشت: بدون اینکه هیچ تغییری در ظاهر یا فرآیند محصولی ثبت آگهی ایجاد کنیم، شاهد بهبود قابل توجه در متریکهای محصولی و حتی افزایش محسوس درآمد دیوار بودیم!
ماجرا چه بود؟ چالشهای سرویس قدیمی ثبت آگهی
سرویس قدیمی ثبت آگهی که با زبان پایتون توسعه داده شده بود، در گذر زمان و با افزایش بار ترافیکی، دچار مشکلاتی شده بود که هم کاربران و هم تیمهای فنی دیوار را آزار میداد:
🦀 کندی و خطاهای مکرر: طراحی قدیمی سرویس دیگر نمیتوانست حجم بالای درخواستها را به خوبی مدیریت کند. کاربران اغلب با کندی در بارگذاری صفحات فرم ثبت آگهی و حتی خطاهای غیرمنتظره در لحظهی نهایی فشردن دکمه «ثبت آگهی» مواجه میشدند. طبق گزارشها، نزدیک به ۱۰ درصد تماسهای پشتیبانی دیوار ناشی از همین مشکلات در فرآیند ثبت یا ویرایش آگهی بود و حدود ۰.۷۵ درصد درخواستهای ثبت/ویرایش آگهی با خطای غیرمنتظره مواجه میشدند.
🦀 وابستگیهای زیاد و شکنندگی: سرویس ثبت آگهی به سرویسهای داخلی متعددی وابسته بود. بروز مشکل در هر یک از این سرویسها میتوانست کل فرآیند ثبت آگهی را مختل کند.
🦀 تجربهی کاربری نامطلوب: کندی و خطاها باعث میشد کاربران از ثبت آگهی منصرف شوند یا فرآیند را نیمهکاره رها کنند. این تجربهی ناخوشایند، به خصوص برای کاربرانی که برای اولین بار قصد ثبت آگهی داشتند، میتوانست دلسردکننده باشد.
🦀 بهرهوری پایین توسعهدهندگان: سرویس قدیمی از کتابخانهای به نام ui schema برای ساخت فرمها استفاده میکرد که قدیمی، فاقد type safety و مستندات کافی بود. این موضوع باعث بروز خطاهای زیاد در زمان توسعه، کندی فرآیند توسعه (تا ۲۰٪ کندتر طبق گفتهی تیمها) و سختی در افزودن قابلیتهای جدید میشد. مذاکرات مداوم بین تیمهای بکاند و کلاینت برای اطمینان از هماهنگی، زمان زیادی را تلف میکرد.
با توجه به این چالشها، در اردیبهشت ۱۴۰۲ تیمی اختصاصی برای بازنویسی کامل سرویس ثبت آگهی تشکیل شد. هدف، ساخت سرویسی بهروز، پایدار، سریع و توسعهپذیر بود.
🧠 تغییرات فنیای که دادیم: بازنویسی با نگاهی نو
برای مشاهده ادامه مطلب به سایت ویرگول و وبلاگ فنی دیوار مراجعه کنید.
این مطلب از وبلاگ مهندسی دیوار در وب سایت ویرگول برداشته شده است . آدرس اصلی مقاله : yun.ir/divar01
سال ۱۴۰۱، سرویس ثبت آگهی دیوار، یکی از حیاتیترین بخشهای پلتفرم، با چالشهای فزایندهای روبرو بود. با رشد دیوار و افزایش روزانهی تعداد آگهیها، زیرساخت قدیمی که با پایتون نوشته شده بود، دیگر پاسخگوی نیازهای ما نبود. کاربران هنگام ثبت آگهی با کندی و خطا مواجه میشدند و این موضوع مستقیماً بر تجربهی آنها و در نتیجه بر موفقیت دیوار تأثیر میگذاشت.
تیم فنی تصمیم گرفت برای حل ریشهای این مشکلات، سرویس ثبت آگهی را بازنویسی کند. هدف اصلی بهبود پایداری (Reliability) و سرعت سرویس بود، اما نتیجهی کار، یک غافلگیری خوشایند برای همه ما به همراه داشت: بدون اینکه هیچ تغییری در ظاهر یا فرآیند محصولی ثبت آگهی ایجاد کنیم، شاهد بهبود قابل توجه در متریکهای محصولی و حتی افزایش محسوس درآمد دیوار بودیم!
ماجرا چه بود؟ چالشهای سرویس قدیمی ثبت آگهی
سرویس قدیمی ثبت آگهی که با زبان پایتون توسعه داده شده بود، در گذر زمان و با افزایش بار ترافیکی، دچار مشکلاتی شده بود که هم کاربران و هم تیمهای فنی دیوار را آزار میداد:
🦀 کندی و خطاهای مکرر: طراحی قدیمی سرویس دیگر نمیتوانست حجم بالای درخواستها را به خوبی مدیریت کند. کاربران اغلب با کندی در بارگذاری صفحات فرم ثبت آگهی و حتی خطاهای غیرمنتظره در لحظهی نهایی فشردن دکمه «ثبت آگهی» مواجه میشدند. طبق گزارشها، نزدیک به ۱۰ درصد تماسهای پشتیبانی دیوار ناشی از همین مشکلات در فرآیند ثبت یا ویرایش آگهی بود و حدود ۰.۷۵ درصد درخواستهای ثبت/ویرایش آگهی با خطای غیرمنتظره مواجه میشدند.
🦀 وابستگیهای زیاد و شکنندگی: سرویس ثبت آگهی به سرویسهای داخلی متعددی وابسته بود. بروز مشکل در هر یک از این سرویسها میتوانست کل فرآیند ثبت آگهی را مختل کند.
🦀 تجربهی کاربری نامطلوب: کندی و خطاها باعث میشد کاربران از ثبت آگهی منصرف شوند یا فرآیند را نیمهکاره رها کنند. این تجربهی ناخوشایند، به خصوص برای کاربرانی که برای اولین بار قصد ثبت آگهی داشتند، میتوانست دلسردکننده باشد.
🦀 بهرهوری پایین توسعهدهندگان: سرویس قدیمی از کتابخانهای به نام ui schema برای ساخت فرمها استفاده میکرد که قدیمی، فاقد type safety و مستندات کافی بود. این موضوع باعث بروز خطاهای زیاد در زمان توسعه، کندی فرآیند توسعه (تا ۲۰٪ کندتر طبق گفتهی تیمها) و سختی در افزودن قابلیتهای جدید میشد. مذاکرات مداوم بین تیمهای بکاند و کلاینت برای اطمینان از هماهنگی، زمان زیادی را تلف میکرد.
با توجه به این چالشها، در اردیبهشت ۱۴۰۲ تیمی اختصاصی برای بازنویسی کامل سرویس ثبت آگهی تشکیل شد. هدف، ساخت سرویسی بهروز، پایدار، سریع و توسعهپذیر بود.
🧠 تغییرات فنیای که دادیم: بازنویسی با نگاهی نو
برای مشاهده ادامه مطلب به سایت ویرگول و وبلاگ فنی دیوار مراجعه کنید.
This media is not supported in your browser
VIEW IN TELEGRAM
ویدئوی توضیح پست بالا - یک پروژه آموزشی برای کار با کافکا + فلینک
marco_slot_crunchy_data_building_a_postgres_data_warehouse_using.pdf
981.9 KB
فایل مرتبط با مقاله فوق .
معرفی سایت DataNerd.tech؛ مرجعی برای تحلیل مهارتها و حقوق مشاغل دادهای
سایت DataNerd.tech به عنوان یک مرجع تحلیلی📊، با هدف کمک به متخصصان داده ایجاد شده است تا بتوانند با آگاهی بیشتر، مسیر شغلی خود را انتخاب کنند.
این پلتفرم با جمعآوری روزانه حدود ۶۵۰۰ آگهی شغلی از نتایج جستجوی گوگل و تحلیل آنها از طریق پردازش زبان طبیعی (NLP)، پرطرفدارترین مهارتها و متوسط حقوق هر موقعیت شغلی را ارائه میدهد.
آدرس سایت : https://datanerd.tech
در بخش مربوط به مهندسین داده، مهارتهایی مانند #SQL، #Python، #AWS، #Azure و #Spark جزو پرجستجوترین مهارتها هستند. این دادهها به کاربران کمک میکند تا بدانند چه مهارتهایی در بازار کار بیشتر مورد توجه قرار دارند و بر چه زمینههایی تمرکز بیشتری داشته باشند. همچنین سایت دارای بخشی برای مشاهده روند تغییرات محبوبیت مهارتها در طول زمان است که تصویری دقیقتر از تحولات بازار ارائه میدهد. 📈
بر اساس تحلیلهای ارائهشده در DataNerd.tech، پردرآمدترین مشاغل 💵 به ترتیب شامل مهندس نرمافزار، مهندس یادگیری ماشین و مهندس داده هستند.
از سوی دیگر، گرانترین مهارتهای 💎 بازار عبارتند از #Scala، #Spark، #Snowflake، #Java و #Python که توجه به آنها میتواند در افزایش فرصتهای شغلی و درآمد تأثیر قابل توجهی داشته باشد.
هدف اصلی این سایت، شفافسازی مسیر یادگیری و جلوگیری از هدررفت زمان متخصصان داده در مهارتهای کمارزش است. DataNerd.tech در مسیر خود به سوی ایجاد یک منبع باز از اطلاعات بازار کار، به کاربران کمک میکند تا تصمیمات آگاهانهتر و بهینهتری برای توسعه مهارتهای حرفهای خود بگیرند. 🚀
یک حقیقت تلخ : دنیا امروز به مهارتهای کلاد نیاز بیشتری دارد، اما در ایران، به دلیل محدودیتها، ما بیشتر مجبوریم روی پروژههای اپن سورس که امکان اجرا روی سرورهای خودمان را دارند، کار کنیم.
#مهندسی_داده #تحلیل_داده #علم_داده #بازار_کار_داده #هوش_مصنوعی #Data_Engineering #Data_Science #Data_Analytics #Machine_Learning #Career_Growth
سایت DataNerd.tech به عنوان یک مرجع تحلیلی📊، با هدف کمک به متخصصان داده ایجاد شده است تا بتوانند با آگاهی بیشتر، مسیر شغلی خود را انتخاب کنند.
این پلتفرم با جمعآوری روزانه حدود ۶۵۰۰ آگهی شغلی از نتایج جستجوی گوگل و تحلیل آنها از طریق پردازش زبان طبیعی (NLP)، پرطرفدارترین مهارتها و متوسط حقوق هر موقعیت شغلی را ارائه میدهد.
آدرس سایت : https://datanerd.tech
در بخش مربوط به مهندسین داده، مهارتهایی مانند #SQL، #Python، #AWS، #Azure و #Spark جزو پرجستجوترین مهارتها هستند. این دادهها به کاربران کمک میکند تا بدانند چه مهارتهایی در بازار کار بیشتر مورد توجه قرار دارند و بر چه زمینههایی تمرکز بیشتری داشته باشند. همچنین سایت دارای بخشی برای مشاهده روند تغییرات محبوبیت مهارتها در طول زمان است که تصویری دقیقتر از تحولات بازار ارائه میدهد. 📈
بر اساس تحلیلهای ارائهشده در DataNerd.tech، پردرآمدترین مشاغل 💵 به ترتیب شامل مهندس نرمافزار، مهندس یادگیری ماشین و مهندس داده هستند.
از سوی دیگر، گرانترین مهارتهای 💎 بازار عبارتند از #Scala، #Spark، #Snowflake، #Java و #Python که توجه به آنها میتواند در افزایش فرصتهای شغلی و درآمد تأثیر قابل توجهی داشته باشد.
هدف اصلی این سایت، شفافسازی مسیر یادگیری و جلوگیری از هدررفت زمان متخصصان داده در مهارتهای کمارزش است. DataNerd.tech در مسیر خود به سوی ایجاد یک منبع باز از اطلاعات بازار کار، به کاربران کمک میکند تا تصمیمات آگاهانهتر و بهینهتری برای توسعه مهارتهای حرفهای خود بگیرند. 🚀
یک حقیقت تلخ : دنیا امروز به مهارتهای کلاد نیاز بیشتری دارد، اما در ایران، به دلیل محدودیتها، ما بیشتر مجبوریم روی پروژههای اپن سورس که امکان اجرا روی سرورهای خودمان را دارند، کار کنیم.
#مهندسی_داده #تحلیل_داده #علم_داده #بازار_کار_داده #هوش_مصنوعی #Data_Engineering #Data_Science #Data_Analytics #Machine_Learning #Career_Growth
چطور از هوش مصنوعی در برنامهنویسی حرفهایتر استفاده کنیم؟
در دنیای امروز، ابزارهای هوش مصنوعی مثل Cursor و Copilot باعث شدهاند فکر کنیم ساخت هر پروژهای سادهتر از همیشه شده است.
اما خیلی زود با یک واقعیت روبرو میشویم: اگر بدون طراحی درست و مدیریت دقیق از AI کمک بگیریم، خیلی راحت در چرخهی فرسایندهی خطاها و آشفتگی گم میشویم.
🔁 این چرخهی آزاردهنده معمولا اینطور شروع میشود:
✅از عامل هوشمند میخواهیم مشکلی را حل کند.
✅پاسخ میدهد که مشکل رفع شده، ولی خطا هنوز باقی است.
✅دوباره درخواست میکنیم، #AI قول میدهد بهتر شده، ولی مشکل جدیدی ظاهر میشود.
✅خطای جدید رفع میشود، ولی خطای قبلی برمیگردد!
✅در نهایت حتی یادمان میرود دقیقا چه چیزی میخواستیم بسازیم...
برای بهبود این تجربهی فرساینده و جلوگیری از این چرخهی غیرحرفهای، امروز خلاصهای از پست آموزندهی آقای Peter Wooldridge در لینکدین را با هم مرور میکنیم و ادامه متن الهام گرفته از پست ایشان است:
https://www.linkedin.com/feed/update/urn:li:activity:7321534312430854146/
✏️ برای جلوگیری از این مسیر فرسایشی و ساختن یک تجربهی حرفهایتر، چند اصل ساده ولی حیاتی وجود دارد:
🔁 قبل از هر کاری طراحی واضح انجام بده: دقیقا مشخص کن چه چیزی میخواهی و چه بخشهایی در پروژه وجود دارد.
❓ به جای اینکه مستقیم درخواست کدنویسی بدهی، سوالات روشن و هدفمند بپرس. مثلا: "بهترین روش برای مدیریت خطاهای API چیست؟"
📜 اگر از Cursor استفاده میکنی، حتما یک فایل .cursorrules بساز تا هوش مصنوعی بداند کی باید فکر کند و کی باید کدنویسی کند.
( از آدرس زیر قوانین cursor را بردارید و آنرا به بخش قوانین در تنظیمات cursor اضافه کنید :https://x.com/0xDesigner/status/1915152801761812783 )
🌐 برای دسترسی سریع به مستندات، از دستور @web استفاده کن.
🛠 هنگام دیباگ کردن، به جای فرمان دادن، با سوال پیش برو. هدایت کردن بهتر از تحمیل کردن است.
⏪ اگر تغییرات بد پیش رفت، ریورت کن، به عقب برگرد، و برنامه را سادهتر بچین.
🔁 در صورت نیاز، بدون ترس پروژه را بازطراحی کن و با یک طرح سادهتر دوباره شروع کن.
توضیحات فوق به همراه شکلهای مورد نیاز از تنظمیات cursor در این آدرس از توئیتر قابل مشاهده است :
https://x.com/0xDesigner/status/1915152801761812783
🧠 در مورد Copilot هم بهتر است بدانیم:
دستیار Copilot برای پاسخهای سریع و تولید اولیهی کد فوقالعاده است.
اما استفادهی بدون مدیریت از حالت Agent آن میتواند خیلی سریع پروژه را وارد آشفتگی کند.
🎯 توصیهی کاربردی: بیشتر از بخش Ask استفاده کن، و تنها زمانی سراغ حالت Agent برو که طراحی، تقسیم وظایف و هدف هر بخش را از قبل مشخص کرده باشی.
✨ پس یادت باشد:
اول خوب طراحی کن → سوال دقیق بپرس → بعد از قدرت AI برای ساختن استفاده کن.
وگرنه به راحتی در یک حلقهی بیپایان از خطاها و دوبارهکاری گیر میکنی!
در دنیای امروز، ابزارهای هوش مصنوعی مثل Cursor و Copilot باعث شدهاند فکر کنیم ساخت هر پروژهای سادهتر از همیشه شده است.
اما خیلی زود با یک واقعیت روبرو میشویم: اگر بدون طراحی درست و مدیریت دقیق از AI کمک بگیریم، خیلی راحت در چرخهی فرسایندهی خطاها و آشفتگی گم میشویم.
🔁 این چرخهی آزاردهنده معمولا اینطور شروع میشود:
✅از عامل هوشمند میخواهیم مشکلی را حل کند.
✅پاسخ میدهد که مشکل رفع شده، ولی خطا هنوز باقی است.
✅دوباره درخواست میکنیم، #AI قول میدهد بهتر شده، ولی مشکل جدیدی ظاهر میشود.
✅خطای جدید رفع میشود، ولی خطای قبلی برمیگردد!
✅در نهایت حتی یادمان میرود دقیقا چه چیزی میخواستیم بسازیم...
برای بهبود این تجربهی فرساینده و جلوگیری از این چرخهی غیرحرفهای، امروز خلاصهای از پست آموزندهی آقای Peter Wooldridge در لینکدین را با هم مرور میکنیم و ادامه متن الهام گرفته از پست ایشان است:
https://www.linkedin.com/feed/update/urn:li:activity:7321534312430854146/
✏️ برای جلوگیری از این مسیر فرسایشی و ساختن یک تجربهی حرفهایتر، چند اصل ساده ولی حیاتی وجود دارد:
🔁 قبل از هر کاری طراحی واضح انجام بده: دقیقا مشخص کن چه چیزی میخواهی و چه بخشهایی در پروژه وجود دارد.
❓ به جای اینکه مستقیم درخواست کدنویسی بدهی، سوالات روشن و هدفمند بپرس. مثلا: "بهترین روش برای مدیریت خطاهای API چیست؟"
📜 اگر از Cursor استفاده میکنی، حتما یک فایل .cursorrules بساز تا هوش مصنوعی بداند کی باید فکر کند و کی باید کدنویسی کند.
( از آدرس زیر قوانین cursor را بردارید و آنرا به بخش قوانین در تنظیمات cursor اضافه کنید :https://x.com/0xDesigner/status/1915152801761812783 )
🌐 برای دسترسی سریع به مستندات، از دستور @web استفاده کن.
🛠 هنگام دیباگ کردن، به جای فرمان دادن، با سوال پیش برو. هدایت کردن بهتر از تحمیل کردن است.
⏪ اگر تغییرات بد پیش رفت، ریورت کن، به عقب برگرد، و برنامه را سادهتر بچین.
🔁 در صورت نیاز، بدون ترس پروژه را بازطراحی کن و با یک طرح سادهتر دوباره شروع کن.
توضیحات فوق به همراه شکلهای مورد نیاز از تنظمیات cursor در این آدرس از توئیتر قابل مشاهده است :
https://x.com/0xDesigner/status/1915152801761812783
🧠 در مورد Copilot هم بهتر است بدانیم:
دستیار Copilot برای پاسخهای سریع و تولید اولیهی کد فوقالعاده است.
اما استفادهی بدون مدیریت از حالت Agent آن میتواند خیلی سریع پروژه را وارد آشفتگی کند.
🎯 توصیهی کاربردی: بیشتر از بخش Ask استفاده کن، و تنها زمانی سراغ حالت Agent برو که طراحی، تقسیم وظایف و هدف هر بخش را از قبل مشخص کرده باشی.
✨ پس یادت باشد:
اول خوب طراحی کن → سوال دقیق بپرس → بعد از قدرت AI برای ساختن استفاده کن.
وگرنه به راحتی در یک حلقهی بیپایان از خطاها و دوبارهکاری گیر میکنی!
چرا دریافت نتایج کوئری گاهی اینقدر طول میکشد؟ ✨
با پیشرفت روزافزون فناوری دیتابیسها، ضروری است که روشها و پروتکلهای انتقال داده نیز بهروزرسانی شوند تا بتوان از تمامی ظرفیت و توان پردازشی این سیستمها بهطور مؤثر بهرهبرداری کرد.
فرض کنید به عنوان یک تحلیلگر داده، با استفاده از درایور ODBC به ClickHouse متصل شدهاید و دستوری برای بازیابی ۱۰ هزار رکورد خاص اجرا کردهاید. دستور را ارسال میکنید و منتظر نتایج میمانید، اما متوجه میشوید که زمان دریافت نتایج به طرز معناداری بیشتر از زمانی است که همان دستور را مستقیماً در خط فرمان ClickHouse اجرا کردهاید. 😕 این تفاوت زمانی از کجا میآید و چرا برای کاربرانی مثل شما که با دادههای بزرگ کار میکنید، مهم است؟
دلیل اصلی این کندی، به نحوه عملکرد درایورهای سنتی مانند ODBC برمیگردد. ClickHouse یک دیتابیس تحلیلی است که از ذخیرهسازی ستونی استفاده میکند—ساختاری که برای پردازش سریع دادههای حجیم بهینه شده است. اما درایورهای ODBC برای دیتابیسهای ردیفی طراحی شدهاند و مجبورند دادههای ستونی را به فرمت ردیفی تبدیل کنند. این تبدیل، هم زمانبر است و هم منابع زیادی مصرف میکند، که نتیجهاش کاهش عملکرد و تأخیر در دریافت دادههاست. ⏳ برای تحلیلگران داده، مهندسین داده و دانشمندان داده که به سرعت و کارایی وابسته هستند، این یک چالش جدی است.
🚀 فرمت Arrow: استانداردی برای پردازش سریع دادههای تحلیلی
سالهاست که Apache Arrow به عنوان یک فرمت درون حافظه برای کار با دادههای ستونی، به یک استاندارد رایج برای پردازش سریع و بهینه دادههای تحلیلی تبدیل شده است. Arrow با طراحی خاص خود، سربار ناشی از تبدیل دادهها بین فرمتهای مختلف را حذف میکند و امکان پردازش موازی را فراهم میآورد. این یعنی شما میتوانید دادههای بزرگ را با سرعت بیشتری تحلیل کنید. 📊 این فرمت با ابزارهای محبوبی مثل Pandas، Apache Spark و Dask سازگار است و به همین دلیل، برای جامعه داده به یک انتخاب ایدهآل تبدیل شده است.
حالا تصور کنید اگر بتوانید همین سرعت و کارایی را مستقیماً در ارتباط با دیتابیس داشته باشید. ADBC دقیقا با همین هدف و توسط پروژه محبوب Arrow توسعه داده شد.
🌟 کتابخانه ADBC: راهکاری مدرن برای ارتباط سریع با دیتابیسها
اینجاست که ADBC (Arrow Database Connectivity) وارد میشود! ADBC یک رابط برنامهنویسی کاربردی (API) مدرن است که به شما اجازه میدهد دادهها را به صورت مستقیم و در فرمت ستونی از دیتابیسهایی مثل ClickHouse یا حتی پستگرس دریافت کنید. با ADBC، دیگر نیازی به تبدیلهای وقتگیر به فرمت ردیفی نیست—دادهها با همان ساختار ستونی که برای تحلیل بهینه است، به اپلیکیشن شما منتقل میشوند. 🚄
🎯 مزایای ADBC برای تحلیلگران و مهندسین داده
- سرعت بیشتر: حذف تبدیلهای ردیفی، زمان دریافت دادهها را به شدت کاهش میدهد.
- پشتیبانی از استریمینگ: دادهها به صورت پیوسته و بدون وقفه منتقل میشوند.
- انعطافپذیری: با دیتابیسهای مختلف، از ClickHouse تا PostgreSQL، کار میکند.
- اکوسیستم کامل: یک API یکپارچه با ابزارهایی مثل Flight SQL که کار توسعه و کاربرد آنرا سادهتر میکنند.
برای پروژههای تحلیلی که زمان و دقت در آنها حرف اول را میزند، تفاوت سرعت ناشی از به کار گیری ADBC برای اتصال به دیتابیسها میتواند بهرهوری شما را متحول کند. 📈
نکته مهم دیگری که باید اشاره شود این است که حتی برای دیتابیسهای کلاسیک، اگر قصد دریافت حجم زیاد دیتا برای پردازش با ابزارهایی مانند پانداز یا polars را دارید، باز هم ADBC بهینهتر است. مثال موجود در شکل این پست هم در همین راستاست.
#DataEngineering #Database #ADBC #ApacheArrow #BigData #PerformanceOptimization #DuckDB #PostgreSQL
منبع : https://arrow.apache.org/blog/2025/02/28/data-wants-to-be-free/
با پیشرفت روزافزون فناوری دیتابیسها، ضروری است که روشها و پروتکلهای انتقال داده نیز بهروزرسانی شوند تا بتوان از تمامی ظرفیت و توان پردازشی این سیستمها بهطور مؤثر بهرهبرداری کرد.
فرض کنید به عنوان یک تحلیلگر داده، با استفاده از درایور ODBC به ClickHouse متصل شدهاید و دستوری برای بازیابی ۱۰ هزار رکورد خاص اجرا کردهاید. دستور را ارسال میکنید و منتظر نتایج میمانید، اما متوجه میشوید که زمان دریافت نتایج به طرز معناداری بیشتر از زمانی است که همان دستور را مستقیماً در خط فرمان ClickHouse اجرا کردهاید. 😕 این تفاوت زمانی از کجا میآید و چرا برای کاربرانی مثل شما که با دادههای بزرگ کار میکنید، مهم است؟
دلیل اصلی این کندی، به نحوه عملکرد درایورهای سنتی مانند ODBC برمیگردد. ClickHouse یک دیتابیس تحلیلی است که از ذخیرهسازی ستونی استفاده میکند—ساختاری که برای پردازش سریع دادههای حجیم بهینه شده است. اما درایورهای ODBC برای دیتابیسهای ردیفی طراحی شدهاند و مجبورند دادههای ستونی را به فرمت ردیفی تبدیل کنند. این تبدیل، هم زمانبر است و هم منابع زیادی مصرف میکند، که نتیجهاش کاهش عملکرد و تأخیر در دریافت دادههاست. ⏳ برای تحلیلگران داده، مهندسین داده و دانشمندان داده که به سرعت و کارایی وابسته هستند، این یک چالش جدی است.
🚀 فرمت Arrow: استانداردی برای پردازش سریع دادههای تحلیلی
سالهاست که Apache Arrow به عنوان یک فرمت درون حافظه برای کار با دادههای ستونی، به یک استاندارد رایج برای پردازش سریع و بهینه دادههای تحلیلی تبدیل شده است. Arrow با طراحی خاص خود، سربار ناشی از تبدیل دادهها بین فرمتهای مختلف را حذف میکند و امکان پردازش موازی را فراهم میآورد. این یعنی شما میتوانید دادههای بزرگ را با سرعت بیشتری تحلیل کنید. 📊 این فرمت با ابزارهای محبوبی مثل Pandas، Apache Spark و Dask سازگار است و به همین دلیل، برای جامعه داده به یک انتخاب ایدهآل تبدیل شده است.
حالا تصور کنید اگر بتوانید همین سرعت و کارایی را مستقیماً در ارتباط با دیتابیس داشته باشید. ADBC دقیقا با همین هدف و توسط پروژه محبوب Arrow توسعه داده شد.
🌟 کتابخانه ADBC: راهکاری مدرن برای ارتباط سریع با دیتابیسها
اینجاست که ADBC (Arrow Database Connectivity) وارد میشود! ADBC یک رابط برنامهنویسی کاربردی (API) مدرن است که به شما اجازه میدهد دادهها را به صورت مستقیم و در فرمت ستونی از دیتابیسهایی مثل ClickHouse یا حتی پستگرس دریافت کنید. با ADBC، دیگر نیازی به تبدیلهای وقتگیر به فرمت ردیفی نیست—دادهها با همان ساختار ستونی که برای تحلیل بهینه است، به اپلیکیشن شما منتقل میشوند. 🚄
🎯 مزایای ADBC برای تحلیلگران و مهندسین داده
- سرعت بیشتر: حذف تبدیلهای ردیفی، زمان دریافت دادهها را به شدت کاهش میدهد.
- پشتیبانی از استریمینگ: دادهها به صورت پیوسته و بدون وقفه منتقل میشوند.
- انعطافپذیری: با دیتابیسهای مختلف، از ClickHouse تا PostgreSQL، کار میکند.
- اکوسیستم کامل: یک API یکپارچه با ابزارهایی مثل Flight SQL که کار توسعه و کاربرد آنرا سادهتر میکنند.
برای پروژههای تحلیلی که زمان و دقت در آنها حرف اول را میزند، تفاوت سرعت ناشی از به کار گیری ADBC برای اتصال به دیتابیسها میتواند بهرهوری شما را متحول کند. 📈
نکته مهم دیگری که باید اشاره شود این است که حتی برای دیتابیسهای کلاسیک، اگر قصد دریافت حجم زیاد دیتا برای پردازش با ابزارهایی مانند پانداز یا polars را دارید، باز هم ADBC بهینهتر است. مثال موجود در شکل این پست هم در همین راستاست.
#DataEngineering #Database #ADBC #ApacheArrow #BigData #PerformanceOptimization #DuckDB #PostgreSQL
منبع : https://arrow.apache.org/blog/2025/02/28/data-wants-to-be-free/
Apache Arrow
Data Wants to Be Free: Fast Data Exchange with Apache Arrow
Apache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics. It specifies a standardized language-independent column-oriented memory format for flat and nested data, organized for efficient analytic…
چالشهای مهندسان داده در دنیای ذخیرهسازی دادهها 🌐
فرض کنید شما در تیم مهندسی داده یک پروژه هستید و با چالشهای مختلفی در حوزه ذخیره دادهها مواجهید. مثلا :
💭 انتخاب بین سرویسهای ذخیرهسازی مختلف : باید تصمیم بگیرید دادهها را در AWS S3، GCS یا Azure Blob Storage ذخیره کنید، اما هر سرویس API خاص خودش را دارد. تغییر بین این سرویسها یا مهاجرت به سرویس جدید، نیازمند بازنویسی بخش زیادی از کدهاست و زمان و منابع تیم را هدر میدهد.
🔄ذخیرهسازی همزمان در فضای ابری و محلی : میخواهید دادهها را هم در فضای ابری (برای مقیاسپذیری) و هم در سرورهای محلی (برای بازیابی سریع) ذخیره کنید. اما هماهنگسازی این دو بدون پیچیدگی و تغییرات گسترده در کدها، تقریباً غیرممکن به نظر میرسد.
🌍 دسترسی یکپارچه به منابع داده متنوع : دادههای شما در سیستمهای مختلفی مثل یک پایگاه داده کلیدمقدار مانند RocksDB، یک وبدرایو، فضای ابری و فایلسیستم محلی پراکندهاند. (شکل را با دقت نگاه کنید) مدیریت این منابع با APIهای متفاوت، زمان توسعه را افزایش میدهد و پیچیدگی پروژه را بیشتر میکند.
🛠 کتابخانه OpenDAL چگونه این چالشها را حل میکند؟
کتابخانه OpenDAL یک لایه دسترسی داده متنباز است که با ارائه یک API یکپارچه، این چالشها را به حداقل میرساند. با OpenDAL میتوانید بهراحتی به سیستمهای ذخیرهسازی مختلف متصل شوید، بدون اینکه نیاز به بازنویسی کد یا مدیریت پیچیدگیهای APIهای متفاوت داشته باشید.
نکته : کد ساده پایتون موجود در شکل را حتما چک کنید .
🔹 مزایای OpenDAL برای مهندسان داده:
✅یکپارچگی در دسترسی به دادهها: با OpenDAL شما میتوانید به منابع ذخیرهسازی مختلف دسترسی داشته باشید، چه آنها در فضای ابری باشند و چه روی سرورهای محلی.
✅صرفهجویی در زمان و منابع: دیگر نیازی نیست که هر بار بخواهید به یک سیستم ذخیرهسازی جدید متصل شوید یا تغییرات عمده در کد خود ایجاد کنید. تنها با تغییر تنظیمات OpenDAL میتوانید به منابع جدید دسترسی پیدا کنید.
✅پشتیبانی از چندین سرویس ذخیرهسازی: از AWS S3، Azure Blob Storage، GCS و حتی HDFS پشتیبانی میکند، بنابراین هیچ محدودیتی از این بابت نخواهید داشت.
✅ارتقاء مقیاسپذیری و انعطافپذیری سیستمهای ذخیرهسازی: OpenDAL به شما این امکان را میدهد که ذخیرهسازی دادهها را به راحتی در سیستمهای توزیعشده گسترش دهید.
🌟 آهسته و پیوسته، مهرش به دل نشسته : باز هم Rust
یکی از ویژگیهای برجسته OpenDAL، استفاده از زبان برنامهنویسی Rust در توسعه آن است. در دنیای دادهها، جایی که پردازش حجم عظیمی از اطلاعات و اطمینان از عملکرد بهینه اهمیت دارد، Rust بهتدریج جای خود را باز کرده است. پروژههایی مانند Apache Arrow، Polars و DataFusion از Rust استفاده میکنند و OpenDAL نیز با بهرهگیری از این زبان، توانسته است یک لایه دسترسی داده با کارایی بالا و قابل اعتماد ارائه دهد. Rust نهتنها به توسعهدهندگان امکان میدهد که ابزارهایی مقیاسپذیر و کارآمد بسازند، بلکه به دلیل جامعه رو به رشد و ابزارهای مدرن خود، به یکی از انتخابهای اصلی برای پروژههای متنباز تبدیل شده است. تا Rust که را خواهد و میلش به که باشد ...
🌟 نتیجهگیری:
کتابخانه OpenDAL با API یکپارچه و قابلیتهای گستردهای که ارائه میدهد، پیچیدگیهای دسترسی به دادهها را کاهش میدهد و به مهندسان داده امکان میدهد با سرعت و کارایی بیشتری پروژههای خود را پیش ببرند. این ابزار، با پشتیبانی بنیاد آپاچی، آیندهای روشن در مهندسی داده دارد. 🌐🚀
فرض کنید شما در تیم مهندسی داده یک پروژه هستید و با چالشهای مختلفی در حوزه ذخیره دادهها مواجهید. مثلا :
💭 انتخاب بین سرویسهای ذخیرهسازی مختلف : باید تصمیم بگیرید دادهها را در AWS S3، GCS یا Azure Blob Storage ذخیره کنید، اما هر سرویس API خاص خودش را دارد. تغییر بین این سرویسها یا مهاجرت به سرویس جدید، نیازمند بازنویسی بخش زیادی از کدهاست و زمان و منابع تیم را هدر میدهد.
🔄ذخیرهسازی همزمان در فضای ابری و محلی : میخواهید دادهها را هم در فضای ابری (برای مقیاسپذیری) و هم در سرورهای محلی (برای بازیابی سریع) ذخیره کنید. اما هماهنگسازی این دو بدون پیچیدگی و تغییرات گسترده در کدها، تقریباً غیرممکن به نظر میرسد.
🌍 دسترسی یکپارچه به منابع داده متنوع : دادههای شما در سیستمهای مختلفی مثل یک پایگاه داده کلیدمقدار مانند RocksDB، یک وبدرایو، فضای ابری و فایلسیستم محلی پراکندهاند. (شکل را با دقت نگاه کنید) مدیریت این منابع با APIهای متفاوت، زمان توسعه را افزایش میدهد و پیچیدگی پروژه را بیشتر میکند.
🛠 کتابخانه OpenDAL چگونه این چالشها را حل میکند؟
کتابخانه OpenDAL یک لایه دسترسی داده متنباز است که با ارائه یک API یکپارچه، این چالشها را به حداقل میرساند. با OpenDAL میتوانید بهراحتی به سیستمهای ذخیرهسازی مختلف متصل شوید، بدون اینکه نیاز به بازنویسی کد یا مدیریت پیچیدگیهای APIهای متفاوت داشته باشید.
نکته : کد ساده پایتون موجود در شکل را حتما چک کنید .
🔹 مزایای OpenDAL برای مهندسان داده:
✅یکپارچگی در دسترسی به دادهها: با OpenDAL شما میتوانید به منابع ذخیرهسازی مختلف دسترسی داشته باشید، چه آنها در فضای ابری باشند و چه روی سرورهای محلی.
✅صرفهجویی در زمان و منابع: دیگر نیازی نیست که هر بار بخواهید به یک سیستم ذخیرهسازی جدید متصل شوید یا تغییرات عمده در کد خود ایجاد کنید. تنها با تغییر تنظیمات OpenDAL میتوانید به منابع جدید دسترسی پیدا کنید.
✅پشتیبانی از چندین سرویس ذخیرهسازی: از AWS S3، Azure Blob Storage، GCS و حتی HDFS پشتیبانی میکند، بنابراین هیچ محدودیتی از این بابت نخواهید داشت.
✅ارتقاء مقیاسپذیری و انعطافپذیری سیستمهای ذخیرهسازی: OpenDAL به شما این امکان را میدهد که ذخیرهسازی دادهها را به راحتی در سیستمهای توزیعشده گسترش دهید.
🌟 آهسته و پیوسته، مهرش به دل نشسته : باز هم Rust
یکی از ویژگیهای برجسته OpenDAL، استفاده از زبان برنامهنویسی Rust در توسعه آن است. در دنیای دادهها، جایی که پردازش حجم عظیمی از اطلاعات و اطمینان از عملکرد بهینه اهمیت دارد، Rust بهتدریج جای خود را باز کرده است. پروژههایی مانند Apache Arrow، Polars و DataFusion از Rust استفاده میکنند و OpenDAL نیز با بهرهگیری از این زبان، توانسته است یک لایه دسترسی داده با کارایی بالا و قابل اعتماد ارائه دهد. Rust نهتنها به توسعهدهندگان امکان میدهد که ابزارهایی مقیاسپذیر و کارآمد بسازند، بلکه به دلیل جامعه رو به رشد و ابزارهای مدرن خود، به یکی از انتخابهای اصلی برای پروژههای متنباز تبدیل شده است. تا Rust که را خواهد و میلش به که باشد ...
🌟 نتیجهگیری:
کتابخانه OpenDAL با API یکپارچه و قابلیتهای گستردهای که ارائه میدهد، پیچیدگیهای دسترسی به دادهها را کاهش میدهد و به مهندسان داده امکان میدهد با سرعت و کارایی بیشتری پروژههای خود را پیش ببرند. این ابزار، با پشتیبانی بنیاد آپاچی، آیندهای روشن در مهندسی داده دارد. 🌐🚀
چرا Discord بخشهایی از زیرساخت خود را از Go به Rust منتقل کرده است؟🦀
در سالهای اخیر، Rust به یکی از محبوبترین زبانهای برنامهنویسی در میان مهندسان ارشد نرمافزار و معماران سیستم تبدیل شده است. در حالی که Go به دلیل سادگی و سرعت توسعه همچنان طرفداران خود را دارد، Rust با ایمنی حافظه بینظیر، عملکرد قابل پیشبینی و اکوسیستم پویا، بهویژه در سیستمهای حساس و پرترافیک، به گزینهای برتر تبدیل شده است. نمونه بارز این تغییر رویکرد، تصمیم دیسکورد برای بازنویسی سرویس کلیدی "Read States" از Go به Rust است که در مقالهای توسط جسی هووارث در سال 2020 شرح داده شده است. در این پست، دلایل این مهاجرت، مزایای Rust و روند روبهرشد پذیرش آن در صنعت بررسی میشود.
لینک مقاله اصلی :
https://discord.com/blog/why-discord-is-switching-from-go-to-rust
چرا Rust؟ روند روبهرشد در میان مهندسان ارشد
Rust به دلیل ویژگیهای منحصربهفردش بهسرعت در حال جایگزینی Go در پروژههای پیچیده است. مهندسان ارشد به دلایل زیر به این زبان روی میآورند:
✅ ایمنی حافظه و همزمانی در زمان کامپایل: Rust با سیستم مالکیت (Ownership) و Borrow Checker، خطاهایی مانند استفاده پس از آزادسازی (Use-After-Free) یا شرایط رقابتی (Data Races) را در زمان کامپایل حذف میکند. این ویژگی برای پروژههای حساس مانند runtime امن IoT تیم Azure مایکروسافت حیاتی بود، جایی که وقفههای ناشی از GC یا باگهای همزمانی قابلتحمل نبودند.
✅ عملکرد پایدار و بدون افت: بدون نیاز به جمعآوری زباله (GC)، Rust باینریهای Native تولید میکند که عملکردی قابل پیشبینی دارند. این ویژگی در سرویسهای پرترافیک مانند Read States دیسکورد، تاخیرهای لحظهای را حذف کرد.
✅ نگهداری بلندمدت: ابزارهایی مانند Cargo، پیامهای خطای دقیق و استانداردهای کدنویسی قوی، کدهای Rust را خوانا و پایدار نگه میدارند، که در پروژههای طولانیمدت ارزشمند است.
✅ اکوسیستم پویا: crates.io با رشد بیش از 2.1 برابر در سال و بیش از 430 میلیون دانلود در یک روز در سال 2024، نشاندهنده بلوغ کتابخانههای Rust در حوزههایی مانند WebAssembly، بلاکچین و سیستمهای ابری است.
✅ پذیرش گسترده در صنعت: پروژههایی مانند Firecracker (آمازون)، Solana (بلاکچین) و سیستمهای IoT مایکروسافت، Rust را به دلیل ایمنی و کنترل دقیق انتخاب کردهاند.
سرویس Read States دیسکورد: چالشهای Go
سرویس Read States در دیسکورد وظیفه ردیابی وضعیت خوانده شدن پیامها و کانالها را بر عهده دارد. این سرویس در هر اتصال، ارسال یا خواندن پیام فعال میشود و باید تاخیری بسیار پایین داشته باشد تا تجربه کاربری روان بماند. نسخه Go این سرویس در اکثر مواقع سریع بود، اما هر چند دقیقه با تاخیرهای ناگهانی (Latency Spikes) مواجه میشد که به مدل حافظه و GC مربوط بود.
مشکلات Go:
❓ ساختار داده و مقیاس: Read States شامل میلیاردها شیء است که برای هر کاربر و کانال یک نمونه دارند. این اشیاء در یک کش LRU با میلیونها نمونه ذخیره میشوند و صدها هزار بهروزرسانی در ثانیه دارند.
❓ جمعآوری زباله: در Go، حافظه پس از اخراج از کش بلافاصله آزاد نمیشود. GC هر 2 دقیقه یکبار اجرا میشود و کل کش را اسکن میکند، که باعث تاخیرهای قابلتوجه میشد.
❓تلاشهای بهینهسازی: تنظیم درصد GC بیاثر بود، زیرا تخصیص حافظه به اندازه کافی سریع نبود. کاهش اندازه کش LRU تاخیرهای GC را کم کرد، اما به دلیل افزایش بارگذاری از پایگاه داده Cassandra، تاخیرهای 99th Percentile افزایش یافت.
با وجود بهینهسازیهای متعدد، عملکرد Go همچنان ناکافی بود. دیسکورد که پیشتر از Rust در بخشهایی مانند کدگذاری ویدئو (Go Live) و NIFهای Elixir استفاده کرده بود، تصمیم گرفت این سرویس را به Rust منتقل کند.
✴️ ورود Rust به صحنه
تیم Discord پیشتر در بخشهایی مثل رمزنگاری و پردازش ویدئو از Rust استفاده کرده بود، و تصمیم گرفت یک نسخهی کامل از Read States را با Rust بازنویسی کند.
📊 نتایج شگفتانگیز بودند:
✅ بدون GC → مدیریت حافظه در زمان کامپایل (مدل Ownership)
✅ تأخیر یکنواختتر → حذف spikes ناشی از GC
✅ ایمنی حافظه در زمان کامپایل → بدون نیاز به چکهای runtime
✅ پشتیبانی قوی از async → با استفاده از tokio و async/await
📈 نتایج نهایی:
✅ بهبود چشمگیر درصدهای ۹۹٪ و ۹۹.۹٪ در زمان پاسخدهی
✅ تاخیر: تاخیرهای دورهای حذف شدند، میانگین زمان پاسخ به میکروثانیه و حداکثر زمان برای @mentions به میلیثانیه رسید.
✅ منابع: مصرف CPU و حافظه بهطور چشمگیری کاهش یافت.
✅ افزایش ظرفیت کش: برخلاف Go، افزایش ظرفیت کش LRU به 8 میلیون Read State عملکرد را بهبود داد، زیرا Rust نیازی به GC نداشت.
🧠 جمعبندی برای مهندسین نرمافزار/داده:
در سالهای اخیر، Rust به یکی از محبوبترین زبانهای برنامهنویسی در میان مهندسان ارشد نرمافزار و معماران سیستم تبدیل شده است. در حالی که Go به دلیل سادگی و سرعت توسعه همچنان طرفداران خود را دارد، Rust با ایمنی حافظه بینظیر، عملکرد قابل پیشبینی و اکوسیستم پویا، بهویژه در سیستمهای حساس و پرترافیک، به گزینهای برتر تبدیل شده است. نمونه بارز این تغییر رویکرد، تصمیم دیسکورد برای بازنویسی سرویس کلیدی "Read States" از Go به Rust است که در مقالهای توسط جسی هووارث در سال 2020 شرح داده شده است. در این پست، دلایل این مهاجرت، مزایای Rust و روند روبهرشد پذیرش آن در صنعت بررسی میشود.
لینک مقاله اصلی :
https://discord.com/blog/why-discord-is-switching-from-go-to-rust
چرا Rust؟ روند روبهرشد در میان مهندسان ارشد
Rust به دلیل ویژگیهای منحصربهفردش بهسرعت در حال جایگزینی Go در پروژههای پیچیده است. مهندسان ارشد به دلایل زیر به این زبان روی میآورند:
✅ ایمنی حافظه و همزمانی در زمان کامپایل: Rust با سیستم مالکیت (Ownership) و Borrow Checker، خطاهایی مانند استفاده پس از آزادسازی (Use-After-Free) یا شرایط رقابتی (Data Races) را در زمان کامپایل حذف میکند. این ویژگی برای پروژههای حساس مانند runtime امن IoT تیم Azure مایکروسافت حیاتی بود، جایی که وقفههای ناشی از GC یا باگهای همزمانی قابلتحمل نبودند.
✅ عملکرد پایدار و بدون افت: بدون نیاز به جمعآوری زباله (GC)، Rust باینریهای Native تولید میکند که عملکردی قابل پیشبینی دارند. این ویژگی در سرویسهای پرترافیک مانند Read States دیسکورد، تاخیرهای لحظهای را حذف کرد.
✅ نگهداری بلندمدت: ابزارهایی مانند Cargo، پیامهای خطای دقیق و استانداردهای کدنویسی قوی، کدهای Rust را خوانا و پایدار نگه میدارند، که در پروژههای طولانیمدت ارزشمند است.
✅ اکوسیستم پویا: crates.io با رشد بیش از 2.1 برابر در سال و بیش از 430 میلیون دانلود در یک روز در سال 2024، نشاندهنده بلوغ کتابخانههای Rust در حوزههایی مانند WebAssembly، بلاکچین و سیستمهای ابری است.
✅ پذیرش گسترده در صنعت: پروژههایی مانند Firecracker (آمازون)، Solana (بلاکچین) و سیستمهای IoT مایکروسافت، Rust را به دلیل ایمنی و کنترل دقیق انتخاب کردهاند.
سرویس Read States دیسکورد: چالشهای Go
سرویس Read States در دیسکورد وظیفه ردیابی وضعیت خوانده شدن پیامها و کانالها را بر عهده دارد. این سرویس در هر اتصال، ارسال یا خواندن پیام فعال میشود و باید تاخیری بسیار پایین داشته باشد تا تجربه کاربری روان بماند. نسخه Go این سرویس در اکثر مواقع سریع بود، اما هر چند دقیقه با تاخیرهای ناگهانی (Latency Spikes) مواجه میشد که به مدل حافظه و GC مربوط بود.
مشکلات Go:
❓ ساختار داده و مقیاس: Read States شامل میلیاردها شیء است که برای هر کاربر و کانال یک نمونه دارند. این اشیاء در یک کش LRU با میلیونها نمونه ذخیره میشوند و صدها هزار بهروزرسانی در ثانیه دارند.
❓ جمعآوری زباله: در Go، حافظه پس از اخراج از کش بلافاصله آزاد نمیشود. GC هر 2 دقیقه یکبار اجرا میشود و کل کش را اسکن میکند، که باعث تاخیرهای قابلتوجه میشد.
❓تلاشهای بهینهسازی: تنظیم درصد GC بیاثر بود، زیرا تخصیص حافظه به اندازه کافی سریع نبود. کاهش اندازه کش LRU تاخیرهای GC را کم کرد، اما به دلیل افزایش بارگذاری از پایگاه داده Cassandra، تاخیرهای 99th Percentile افزایش یافت.
با وجود بهینهسازیهای متعدد، عملکرد Go همچنان ناکافی بود. دیسکورد که پیشتر از Rust در بخشهایی مانند کدگذاری ویدئو (Go Live) و NIFهای Elixir استفاده کرده بود، تصمیم گرفت این سرویس را به Rust منتقل کند.
✴️ ورود Rust به صحنه
تیم Discord پیشتر در بخشهایی مثل رمزنگاری و پردازش ویدئو از Rust استفاده کرده بود، و تصمیم گرفت یک نسخهی کامل از Read States را با Rust بازنویسی کند.
📊 نتایج شگفتانگیز بودند:
✅ بدون GC → مدیریت حافظه در زمان کامپایل (مدل Ownership)
✅ تأخیر یکنواختتر → حذف spikes ناشی از GC
✅ ایمنی حافظه در زمان کامپایل → بدون نیاز به چکهای runtime
✅ پشتیبانی قوی از async → با استفاده از tokio و async/await
📈 نتایج نهایی:
✅ بهبود چشمگیر درصدهای ۹۹٪ و ۹۹.۹٪ در زمان پاسخدهی
✅ تاخیر: تاخیرهای دورهای حذف شدند، میانگین زمان پاسخ به میکروثانیه و حداکثر زمان برای @mentions به میلیثانیه رسید.
✅ منابع: مصرف CPU و حافظه بهطور چشمگیری کاهش یافت.
✅ افزایش ظرفیت کش: برخلاف Go، افزایش ظرفیت کش LRU به 8 میلیون Read State عملکرد را بهبود داد، زیرا Rust نیازی به GC نداشت.
🧠 جمعبندی برای مهندسین نرمافزار/داده:
ادامه از پست قبل :
زبان Rust بهدلایل زیر به انتخاب مهمی برای سیستمهای mission-critical تبدیل شده است:
🔹 مدیریت حافظه بدون GC
🔹 پرفورمنس بالا و قابل پیشبینی
🔹 ایمنی حافظه و همزمانی در زمان کامپایل
🔹 اکوسیستم async در حال رشد (tokio، actix و...)
🏢 شرکتهایی مثل AWS، Microsoft، Discord با مهاجرت به Rust، این مسیر را هم فنی و هم راهبردی میدانند.
💡 اما باید واقعبین بود:
⚠️ اکوسیستم Rust هنوز به بلوغ کامل نرسیده
⚠️ منحنی یادگیری بالا دارد
⚠️ توسعه آن نسبت به Go و Python سخت تر است.
اما در حوزههایی مثل:
🚀 طراحی زیرساخت داده
🔁 پایپلاینهای پردازش مقیاسپذیر
💡 سامانههای real-time و سنگین
زبان Rust یک انتخاب اجتناب ناپذیر شده است.
در صنعت نیز، Rust در پروژههایی مانند Firecracker، Solana و سیستمهای IoT مایکروسافت به دلیل ایمنی و عملکرد بالا پذیرفته شده است. به گفته یکی از متخصصان:
«نبوغ Go در داشتن GC است. نبوغ Rust در این است که به آن نیازی ندارد.»
مهاجرت سرویس Read States از Go به Rust نمونهای موفق از پذیرش فناوریهای نوظهور برای حل مشکلات عملکرد است. Rust با حذف تاخیرهای GC، بهبود عملکرد و ارائه ایمنی حافظه، تجربه کاربری بهتری برای دیسکورد فراهم کرد. در دنیایی که امنیت، عملکرد و قابلیت اطمینان اهمیت روزافزونی دارند، Rust نهتنها یک انتخاب خاص، بلکه استانداردی جدید در معماری نرمافزار است. در دنیای مهندسی داده، که سرعت، پایداری و کنترل منابع اهمیت بالایی دارد، Rust میتواند مزایای چشمگیری ارائه دهد. این زبان در حال تبدیل شدن به یکی از اجزای کلیدی زیرساختهای دادهای نسل جدید است — نه فقط بهعنوان زبان سیستمنویسی، بلکه بهعنوان پلتفرمی برای ساخت سامانههای سریع، ایمن و مقیاسپذیر.
زبان Rust بهدلایل زیر به انتخاب مهمی برای سیستمهای mission-critical تبدیل شده است:
🔹 مدیریت حافظه بدون GC
🔹 پرفورمنس بالا و قابل پیشبینی
🔹 ایمنی حافظه و همزمانی در زمان کامپایل
🔹 اکوسیستم async در حال رشد (tokio، actix و...)
🏢 شرکتهایی مثل AWS، Microsoft، Discord با مهاجرت به Rust، این مسیر را هم فنی و هم راهبردی میدانند.
💡 اما باید واقعبین بود:
⚠️ اکوسیستم Rust هنوز به بلوغ کامل نرسیده
⚠️ منحنی یادگیری بالا دارد
⚠️ توسعه آن نسبت به Go و Python سخت تر است.
اما در حوزههایی مثل:
🚀 طراحی زیرساخت داده
🔁 پایپلاینهای پردازش مقیاسپذیر
💡 سامانههای real-time و سنگین
زبان Rust یک انتخاب اجتناب ناپذیر شده است.
در صنعت نیز، Rust در پروژههایی مانند Firecracker، Solana و سیستمهای IoT مایکروسافت به دلیل ایمنی و عملکرد بالا پذیرفته شده است. به گفته یکی از متخصصان:
«نبوغ Go در داشتن GC است. نبوغ Rust در این است که به آن نیازی ندارد.»
مهاجرت سرویس Read States از Go به Rust نمونهای موفق از پذیرش فناوریهای نوظهور برای حل مشکلات عملکرد است. Rust با حذف تاخیرهای GC، بهبود عملکرد و ارائه ایمنی حافظه، تجربه کاربری بهتری برای دیسکورد فراهم کرد. در دنیایی که امنیت، عملکرد و قابلیت اطمینان اهمیت روزافزونی دارند، Rust نهتنها یک انتخاب خاص، بلکه استانداردی جدید در معماری نرمافزار است. در دنیای مهندسی داده، که سرعت، پایداری و کنترل منابع اهمیت بالایی دارد، Rust میتواند مزایای چشمگیری ارائه دهد. این زبان در حال تبدیل شدن به یکی از اجزای کلیدی زیرساختهای دادهای نسل جدید است — نه فقط بهعنوان زبان سیستمنویسی، بلکه بهعنوان پلتفرمی برای ساخت سامانههای سریع، ایمن و مقیاسپذیر.