طراحی یک موتور پردازش جریان با Rust: بررسی Sail 0.2.2
چند وقت پیش به کتابخانه متنباز Sail برخوردم که نسخه ۰٫۲٫۲ آن تازه منتشر شده. با اینکه هنوز در مراحل ابتدایی است، طراحی هوشمندانهاش توجه من را جلب کرد. Sail یک موتور پردازش داده سبک، سریع و مدرن است که با زبان Rust توسعه یافته و از پیشرفتهای اخیر در پردازش دادهها و تجربیات سیستمهای پردازش جریان بهره میبرد.
هدف؟ ساختن جایگزینی برای ابزارهای سنگینی مثل Spark Structured Streaming—اما با طراحی سادهتر، هزینه کمتر، و عملکرد بسیار بالاتر.

معماری دوبخشی: تفکیک واضح بین Control و Data
Sail از یک معماری دو لایه استفاده میکنه:
Control Plane: مغز سیستم که مسئول زمانبندی، هماهنگی و مدیریت اجرای تسکهاست. ارتباط بین اجزا از طریق gRPC انجام میشه که latency پایین و بازدهی بالا داره.
Data Plane: محل پردازش و انتقال دادهها. با بهرهگیری از Apache Arrow IPC، دادهها بدون serialization بین اجزا جابجا میشن. این یعنی کارایی بالا و پردازش سریع در حافظه.
چرا Rust؟ برای کارایی، ایمنی و کنترل
Rust انتخاب شده چون:
مدیریت حافظه در زمان کامپایل داره → بدون نیاز به GC → بدون توقف ناگهانی
پشتیبانی از async/await با کتابخونههایی مثل Tokio → همزمانی ایمن و سریع
zero-cost abstractions → abstraction بدون هزینهی runtime
جلوگیری از race condition و memory leak
ترکیب این ویژگیها باعث شده Sail بهصورت طبیعی مناسب real-time data processing باشه—با latency پایین و throughput بالا.
اتصال سریع به دنیای Python و AI
Sail راه ارتباط با پایتون رو ساده و سریع کرده:
پشتیبانی از UDFهای پایتون (مثل PySpark)
استفاده از PyO3 برای ارتباط با Python، بدون Py4J و سربار serialization
zero-copy بودن ارتباط → انتقال داده بدون کپی اضافی
پشتیبانی از Pandas UDFs و تبادل مستقیم داده با NumPy/Arrow
این یعنی میتونی از مدلهای ML یا تحلیلهای سفارشی در پایتون استفاده کنی، بدون هزینهی اضافهای که Spark به همراه داره.
موتور SQL قدرتمند و قابل توسعه
Sail یک موتور SQL اختصاصی دارد که با استفاده از پارسرهای ترکیبی chumsky و Rust macros برای گسترش گرامر SQL پیادهسازی شده. این موتور قادر است کوئریهای پیچیده استاندارد مانند TPC-H و TPC-DS را بهخوبی اجرا کند. همچنین، با بهرهگیری از Apache DataFusion، از قابلیتهای بهینهسازی برداری، پردازش ستونی و اجرای همزمان پشتیبانی میکند.
مدل Actor برای همزمانی ایمن و مقیاسپذیر
Sail از الگوی Actor برای اجرای توزیعشده استفاده میکنه:
هر node مثل driver یا worker → یک actor مستقل
ارتباط بین actorها از طریق پیام → بدون lock یا شرایط رقابتی
اجرا در event loop غیربلوکه شونده → همزمانی بهینه
تحمل خطا بالا → crash یک actor کل سیستم رو متوقف نمیکنه
این معماری بهویژه برای سیستمهایی که با دادههای زنده یا حجم بالا کار میکنن عالیه—مثل real-time dashboards یا AI pipelines.
اگر قصد دارید با Spark کار کنید، شاید بد نباشه این گزینه رو به جای اسپارک اصلی امتحان کنید.
آدرس پروژه :https://github.com/lakehq/sail