tgoop.com/bigdata_ir/366
Last Update:
چرا 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 نداشت.
🧠 جمعبندی برای مهندسین نرمافزار/داده:
BY مهندسی داده
Share with your friend now:
tgoop.com/bigdata_ir/366