فراتر از HTTP در Rust: سوکتهای بلادرنگ و FTP
HTTP برای اکثر کارها عالی است. اما در دو زمینه خاص محدودیت دارد.
۱. ارسال بلادرنگ (Real-time push). مرورگرها نیاز دارند بلافاصله از وقوع هر اتفاقی مطلع شوند. WebSockets خام کار میکنند، اما شما باید تمام منطق مربوط به اتصال مجدد (reconnection) و مسیریابی (routing) را خودتان بنویسید. Socket.IO استاندارد توسعهدهندگان JavaScript است، اما Rust تا همین اواخر فاقد یک پیادهسازی سرور مناسب بود.
۲. انتقال فایل از طریق FTP. سیستمهای قدیمی و خطوط لوله رسانهای (media pipelines) در همه جا از FTP استفاده میکنند. اکوسیستم async در Rust برای مدت طولانی در این زمینه با کمبود مواجه بود.
این پست به شما نشان میدهد که چگونه این شکافها را پر کنید. ما یک سرور Socket.IO و یک سرور FTP میسازیم. سپس آنها را به هم متصل میکنیم. وقتی فایلی از طریق FTP آپلود میشود، سیستم بلافاصله به تمام مرورگرهای متصل شده اطلاع میدهد.
ابزارهایی که استفاده میکنیم:
• Socketioxide: پیادهسازی Socket.IO در Rust. این ابزار با هر کلاینت Socket.IO مانند Node.js یا Python کار میکند. • Libunftp: ابزاری برای ساخت سرورهای FTP ترکیبی (composable). • Suppaftp: یک کلاینت FTP async برای Rust.
ویژگیهای کلیدی:
- Socket.IO Rooms: شما میتوانید اتصالات را گروهبندی کنید. وقتی فایلی در یک پوشه خاص آپلود میشود، فقط به کاربران آن اتاق (room) اطلاع میدهید.
- FTP محدود شده: ما یک wrapper سفارشی برای مسدود کردن اقدامات مخرب ساختیم. کاربران میتوانند فایلها را آپلود و دانلود کنند، اما نمیتوانند آنها را حذف یا تغییر نام دهند.
- یکپارچهسازی Async: ما از یک broadcast channel برای اتصال سرور FTP به سرور Socket.IO استفاده میکنیم.
گردش کار (Workflow):
۱. کلاینت FTP یک فایل را در سرور FTP آپلود میکند. ۲. سرور FTP یک رویداد broadcast را فعال میکند. ۳. سرور Socket.IO رویداد را دریافت میکند. ۴. سرور Socket.IO یک رویداد "file_uploaded" را به مرورگر ارسال (emit) میکند.
این الگو فراتر از فایلها کاربرد دارد. میتوانید از آن برای هشدارهای تکمیل وظیفه (job completion)، بهروزرسانیهای دادههای زنده یا داشبوردهای استقرار (deployment) استفاده کنید.
کد کامل در GitHub در دسترس است.