RabbitMQ یک نرمافزار message-broker متنباز است که ارتباط بین برنامهها یا اجزاء مختلف را با فعالیت به عنوان یک صف پیام، تسهیل میکند. این نرمافزار استاندارد Advanced Message Queuing Protocol (AMQP) را پیادهسازی میکند؛ استانداردی که یک پروتکل ارتباطی است و به سیستمها امکان ارتباط ناهمزمان را میدهد. در زیر تعدادی از مفاهیم کلیدی مرتبط با RabbitMQ آورده شدهاند:
- Message Broker (معامل پیام): RabbitMQ به عنوان یک واسط یا معامل پیام بین اجزاء مختلف یک سیستم توزیعشده عمل میکند. این کمک میکند تا تولیدکنندگان پیام از مصرفکنندگان جدا شوند و ارتباط آنها بدون اتصال مستقیم امکانپذیر باشد.
- Message Queue (صف پیام): پیامهای ارسالی توسط تولیدکنندگان قبل از مصرف توسط گیرندگان در صفها ذخیره میشوند. این اطمینان حاصل میکند که حتی اگر مصرفکنندگان فورا در دسترس نباشند، پیامها از دست نرود.
- Producers and Consumers (تولیدکنندگان و مصرفکنندگان): تولیدکنندگان اجزایی هستند که پیامها را ارسال میکنند، در حالی که مصرفکنندگان اجزایی هستند که پیامها را دریافت و پردازش میکنند. RabbitMQ در ارتباط بین این دو نوع اجزاء کمک میکند.
- Exchange (تبادل): یک تبادل مکانیزم مسیریابی است که تعیین میکند چگونه پیامها باید بین صفها توزیع شوند. انواع مختلفی از تبادلات وجود دارد، از جمله مستقیم، تاپیک، فناوت و هدرها؛ هرکدام با منطق مسیریابی خود.
- Bindings (اتصالات): اتصالات رابطه بین تبادلات و صفها را تعریف میکنند و مشخص میکنند چگونه پیامها باید از تبادلات به صفها، بر اساس معیارهای خاصی، هدایت شوند.
- Virtual Hosts (میزبانهای مجازی): RabbitMQ به شما این امکان را میدهد که میزبانهای مجازی ایجاد کنید؛ هرکدام به عنوان یک معامل پیام عمل میکند که دارای تبادلات، صفها و کاربران خود میباشد. این به سازماندهی و تفکیک محیطهای مختلف پیامرسانی کمک میکند.
- AMQP (پروتکل پیشرفته ارسال پیام): پروتکل Advanced Message Queuing Protocol استاندارد باز برای middleware پیامرسانی است که RabbitMQ آن را پیادهسازی میکند. این یک مجموعه قوانین و فرمتها برای پیامهای ارسالی بین سیستمها تعریف میکند، تضمین میکند که سیستمهای مختلف پیامرسانی با یکدیگر سازگار باشند.
RabbitMQ به طور گسترده در انواع برنامهها استفاده میشود، از جمله معماریهای میکروسرویس که در مدیریت ارتباط بين خدمات مختلف به صورت قابل مقیاس و قابل اعتماد کمک میکند. این به زبان Erlang نوشته شده است و از طریق کتابخانههای مشتری، از چندین زبان برنامهنویسی پشتیبانی میکند. در RabbitMQ، انواع مختلفی از تبادلات (Exchange) پشتیبانی میشوند؛ هر کدام با منطق مسیریابی خود. اصلیترین انواع تبادلات در RabbitMQ عبارتند از:
تبادل مستقیم (Direct Exchange)
- در تبادل مستقیم، یک پیام به صفهایی میرود که کلید بایندینگ آنها دقیقاً با کلید مسیریابی پیام همخوانی دارد.
- این یک مکانیزم ساده مسیریابی نقطه به نقطه را فراهم میکند.
تبادل پخش (Fanout Exchange)
- در تبادل پخش، پیامها به تمامی صفهای متصل به آن میرود؛ بدون توجه به کلید مسیریابی.
- این یک مکانیزم پخش راهبردی است.
تبادل موضوع (Topic Exchange)
- تبادلات موضوع پیامها را بر اساس همخوانیهای وایلد کارد بین کلید مسیریابی و الگوی مسیریابی مشخص شده در بایندینگ به صفها میفرستند.
- این نسبت به تبادل مستقیم امکان مسیریابی انعطافپذیرتری را فراهم میکند.
تبادل هدرز (Headers Exchange)
- تبادلات هدرز از ویژگیهای هدر پیام برای مسیریابی استفاده میکنند.
- صفها با هدرهای مشخص بایند میشوند و یک پیام به یک صف ارسال میشود اگر هدرهای آن با مقادیر مشخص شده همخوانی داشته باشند.
تبادل پیشفرض (Default Exchange) (تبادل مستقیم با نام رشته خالی)
- تبادل پیشفرض یک تبادل مستقیم با نام مشخص نشده است.
- این به شما امکان مسیریابی مستقیم پیامها به یک صف با استفاده از نام صف به عنوان کلید مسیریابی را میدهد.
این انواع تبادلات مکانیزمهای مسیریابی مختلفی فراهم میکنند و به شما این امکان را میدهند که الگوهای مسیریابی پیامهای پیچیدهتر و انعطافپذیرتری را در نصب RabbitMQ خود طراحی کنید که به نیازهای خاص برنامه شما بپردازد. RabbitMQ در موارد مختلفی که به ویژه در سیستمها یا برنامههای توزیعشده وجود دارند و اجزاء مختلف نیاز به ارتباط ناهمگام دارند، مفید است. در زیر چندین شرایط ذکر شدهاند که RabbitMQ ممکن است مناسب باشد:
۱- جداسازی اجزاء
زمانی که میخواهید اجزاء یک سیستم را جدا کنید و به آنها این امکان را بدهید که بدون اتصال مستقیم با یکدیگر ارتباط برقرار کنند. این باعث افزایش انعطافپذیری و قابلیت نگهداری ساختار کل میشود.
۲- ارتباط ناهمزمان
در سیستمهایی که ارتباط ناهمزمان ترجیح داده میشود، RabbitMQ میتواند تبادل پیام بین اجزاء مختلف سیستم را بدون نیاز به پاسخ فوری فراهم کند.
۳- معماری میکروسرویس
RabbitMQ به طور معمول در معماریهای میکروسرویس برای مدیریت ارتباط بین میکروسرویسها استفاده میشود. این به حفظ جداسازی کماندازهای بین خدمات کمک میکند.
۴- قابلیت مقیاسپذیری
زمانی که نیاز به راهحل مقیاسپذیر برای مدیریت تعداد زیادی پیام و اطمینان از پردازش بهینه آنها دارید.
۵- قابلیت اطمینان و تحمل اشکال
RabbitMQ ویژگیهایی مانند تأییدپذیری پیام و ذخیرهپذیری را فراهم میکند که در شرایطی که اطمینان و تحمل اشکال اهمیت دارند، مناسب است.
۶- تساوی بار
زمانی که میخواهید بار را بین اجزاء مختلف توزیع کنید و از یک صف پیام استفاده کنید. این میتواند از بروز سوء استفاده در سرویسهای خاصی جلوگیری کند.
۷- سیستمهای رویدادمحور
در معماریهای رویدادمحور که اجزاء به رویدادها یا پیامها واکنش نشان میدهند، RabbitMQ به عنوان یک دارنده رویداد قابل اعتماد عمل میکند.
۸- ادغام عرضه در ترکیبپذیر
زمانی که نیاز به ادغام برنامهها یا خدمات مختلفی دارید که ممکن است به زبانها یا پلتفرمهای مختلف نوشته شده باشند.
۹- مدیریت جریان کار
در شرایطی که میخواهید جریانهای کاری پیچیده را مدیریت کنید و اطمینان حاصل کنید که وظایف به یکنواخت و بهینه اجرا میشوند.
۱۰- صفهای اولویتی
زمانی که نیاز به پردازش پیامها بر اساس اولویت دارید، RabbitMQ صفهای اولویتی را پشتیبانی میکند که در موارد خاص مفید است. لطفاً توجه داشته باشید که هرچند RabbitMQ ابزاری قدرتمند است، اما تصمیم برای استفاده از آن به ویژگیها و نیازهای خاص برنامه یا سیستم شما بستگی دارد. اگر سیستم شما الگوهای پیامرسانی، اجزاء توزیعشده، و نیاز به ارتباط معتبر و ناهمزمان دارد، RabbitMQ ممکن است یک گزینه مناسب باشد.
تفاوت RabbitMQ و Kafka
RabbitMQ و Apache Kafka هر دو از پرکاربردترین برنامههای مدیریت پیام هستند، اما دارای فلسفههای طراحی مختلفی هستند و معمولا در حوزههای مختلف استفاده میشوند. در زیر تفاوتهای کلیدی بین RabbitMQ و Kafka آورده شده است:
۱. مدل پیامرسانی
- RabbitMQ: مدل سنتی بروکر پیام را با صفهای پیام دنبال میکند. برای ارتباط نقطه به نقطه و الگوهای انتشار-اشتراک مناسب است. RabbitMQ بر روی مسیریابی پیامها بین تولیدکنندگان و مصرفکنندگان از طریق تبادلات و صفها تمرکز دارد.
- Kafka: مدل لاگ توزیعشده را دنبال میکند. برای جریان داده با ظرفیت بالا، مقاومت در برابر خطا و جریان دادههای توزیعشده طراحی شده است. Kafka اغلب برای منابع رویداد، پردازش جریان و ساخت خطوط انتقال داده استفاده میشود.
۲. مدت زمان نگهداری پیام
- RabbitMQ: معمولاً پیامها را برای مدت زمان کوتاهتری نگه میدارد و برای مصرف فوری بهینهسازی شده است. ممکن است از دوام برای ذخیره پیامها استفاده کند، اما اغلب این کار به عنوان استفاده اصلی در نظر گرفته نمیشود.
- Kafka: پیامها را برای مدت زمان بیشتری نگه میدارد که این امکان را فراهم میکند که در شرایطی که داده تاریخی اهمیت دارد، به کار رود. ویژگی جدید کافکا به نام «log compaction» این امکان را فراهم میکند که یک مجموعه تراز شده از مقادیر جدیدترین برای هر کلید را حفظ کند.
۳. قابلیت مقیاسپذیری
- RabbitMQ: با افزودن منابع به یک بروکر تعاملی عمودی مقیاس میپذیرد. اگرچه RabbitMQ میتواند در یک خوشه اجرا شود، اما مقیاسپذیری به اندازه کافکا ساده نیست.
- Kafka: با افزودن بیشتر بروکرها به خوشه Kafka افزایش مقیاس پیدا میکند. برای مدیریت حجم بالای داده و سناریوهای با تردید در خطر، طراحی شده است.
۴. حوزه استفاده
- RabbitMQ: معمولاً در برنامههای سنتی انترپرایز، معماری میکروسرویس و شرایطی که جریان زمان واقعی اولویت اصلی نیست استفاده میشود.
- Kafka: برای جریان داده، ساخت لولههای انتقال داده و سناریوهایی که قابلیت مقیاسپذیری افقی و مقاومت در برابر خطا اهمیت دارد مناسب است.
۵. در دوام و ذخیرهپذیری
- RabbitMQ: دارای دوام استفاده میکند که ممکن است بر روی عملکرد تأثیر بگذارد. RabbitMQ به شما امکان پیکربندی سطوح مختلف در دوام پیامها را میدهد.
- Kafka: پیامها را به طور پیشفرض بر روی دیسک ذخیره میکند که این امکان را فراهم میکند که در شرایطی که دوام داده مهم است، استفاده شود.
۶. مدیریت آفست کنندههای مصرفکننده
- RabbitMQ: تأییدها را در سطح پیام مدیریت میکند. مصرفکنندگان اطلاع رسانی دریافت پیامهای جداگانه را انجام میدهند.
مزیت RabbitMQ نسبت به Kafka
قابلیت منحصر بفرد RabbitMQ داشتن exchange است. با استفاده از exchange میتوان چندین Queue را به یک صف مرتبط کرد و همچنین با استفاده از قابلیت routing key، میتوان فیلترهای مورد نیاز را اعمال کرد. به عنوان مثال فرض کنید ما چند سرویس داریم که میخواهیم یک نوع داده مشخص را به صف های متعلق به خود سرویسها ارسال کنیم؛ یعنی هر سرویس فقط داده متعلق به خودش را دریافت کند. برای این کار با استفاده از یک exchange و چند routing key میتوان این کار را انجام داد.
برای پیادهسازی این مدل، باید چند Queue را به یک exchange مرتبط(Bind) کرد و به ازای تمام صف ها routing key تعریف کرد. بر عکس این موضوع هم قابل استفاده است. فرض کنید شما چند نوع داده متفاوت دارید و می خواهید تعدادی از آنها را بر اساس بیزینس خودتان، به یک صف ارسال کنید. برای پیادهسازی این موضوع باید یک Queue را به چند exchange مرتبط کرد. نکته آخر اینکه برای استفاده از این قابلیتها در .Net می توان از کتابخانه Mass Transit استفاده کرد که قابلیت Bind کردن exchange و Queueها به یکدیگر را دارد و میتوان برای یک صف، چند Consumer یا تولیدکننده داشت.
دیدگاهتان را بنویسید