
اگر در زمینهی سیستمهای توزیعشده کار کرده باشید حتما اسم صف و Message Queue به گوشتان خورده است. امروزه نقش Message Queue ها در نرمافزارهای بزرگ و توزیع شده بسیار پررنگ شده است به گونهایی که اکثر شرکتهای بزرگ نرمافزاری از جمله Google، LinkedIn و ... از Message Queue های مختلفی استفاده میکنند یا Message Queue مخصوص خود را توسعه دادهاند.
در این مقاله با مفهوم صف و Message Queue آشنا میشویم و انواع و کاربردهای آن را میبینیم. همچنین به معرفی دو ابزار خیلی معروف و مهم در این حوزه میپردازیم و مزایا و معایب هرکدام را بررسی میکنیم.
یک Message Queue ابزاری است که به عنوان صفی از پیامهای مختلف که بین چند سرویس محتلف ارسال میشود استفاده میشود. این ابزار نوعی ارتباط سرویس به سرویس از جنس async را ارائه میدهد که معمولا در سیستمهای توزیع شده مثل معماری مایکروسرویس و یا معماری Server less کاربرد دارد. در Message Queue ها ارسال کنندهی پیام و دریافت کنندهی آن نیازی ندارند که باهم در یک زمان ارتباط برقرار کنند و پاسخ یکدیگر را بدهند بلکه ارسال کننده میتواند پیامهای خود را درون صف بگذارد و مصرف کننده هر زمان که لازم بود بیاید و این پیامها را از صف بخواند و پردازش کند.
در ترمینولوژی Message Queue ها به سرویسی که پیامها را ارسال میکند producer و به سرویسی که روی صف منتظر پیام جدید میماند و پیامهای جدید را مصرف میکند Consumer میگویند. در واقع ارتباط بین producer و comsumer بدین گونه است که یک سرویس پیامها را در صف ارسال میکند و دیگری روی صف گوش میدهد و منتظر پیام جدید میماند. زمانی که پیام جدید برسد مصرف کننده آنرا دریافت کرده و به Message Queue خبر میدهد که پیام پردازش شده است.
ابزارهای Message Queue استفادههای مختلفی دارند. یکی از استفادههای آنها برای زمانی است که سرعت تولید داده با سرعت پردازش آنها یکسان نیست و ممکن است زمانهایی سرعت تولید از مصرف بیشتر شود. در چنین سناریوهایی از Message Queue ها به عنوان بافر استفاده میشود. تولید کننده میتواند پیامها را به صف ارسال کند و منتظر پردازش داده نماند و به کار خود ادامه بدهد. از طرفی مصرف کننده نیز میتواند با سرعت لازم پیامها را مصرف کند. در این صورت در زمانهایی که سرعت تولید داده از مصرف بیشتر است پیامها در صف باقی میمانند تا اینکه مصرف کننده به آنها برسد و زمانی که سرعت تولید داده کمتر از مصرف بشود، مصرف کننده میتواند صف را خالی کند و کل پیامها را پردازش کند. به اصطلاح برای جاهایی که spikey load داریم استفاده از Message Queue ها میتواند مفید باشد.
کاربرد دیگر Message Queue ها برای پردازش دستهایی یا Batch by batch دادهها است. بدین گونه که دادهها درون Message Queue اضافه میشوند و زمانی که به حد مشخصی برسند توسط مصرف کننده به صورت یکجا و دستهایی پردازش میشوند. پردزاش دستهایی معمولا برای بالا بردن Throughput و سرعت و عملکرد بهینه کاربرد دارد.
همچنین در فضاهای ابری و برنامههایی که به صورت توزیع شده کار میکنند، Message Queue ها کاربردی هستند. در این فضاها برای انتقال پیام از یک سرویس به سرویس دیگر میتوان از صف استفاده کرد. استفاده از صف امکان fault tolerance را نیز به ما میدهد بدین گونه که اگر یکی از سرویسهای پردازش دادهی ما قطع بشود، دیگر تولید کننده از این موضوع بی اطلاع است و میتواند به کار خود ادامه بدهد. همچنین زمانی که مشکل مصرف کننده برطرف شد و به مدار برگشت میتواند کار خود را از جایی که متوقف کرده بود ادامه دهد.
به طور کلی ابزارهای Message Queue در تکنیکها و الگوهای معماری نیز نقش دارند. برای مثال برای پیادهسازی تکنیک Event Sourcing و یا Stream Processing معمولا به یک Message Queue نیاز داریم.
ابزارهای Message Queue ارتباط غیرهمزمان را برای ما فراهم میکنند که به این معناست که سرویسهای مختلف با صف و با Message Queue ارتباط برقرار میکنند نه با یکدیگر و این بدین معناست که وضعیت و سرعت یکی از سرویسها بر دیگری تاثیر ندارد. هیچ سرویسی در سیستم هیچ وقت stall نمیشود و منتظر دیگیری نمیماند و این یعنی جریان دادهی ما بهینه شده است.
Message Queue ها دادهی ما را ثبت و ذخیره میکنند و این باعث میشود که اگر سرویسی در دسترس نبود دادهی آن از دست نرود و از طرفی تولید کننده متوجه نشود. همین باعث افزایش دسترس پذیری و اتکا پذیری میشود و تحمل خطا در سیستم ما را افزایش میدهد. حتی خود Message Queue و پیامها نیز میتوانند redundancy داشته باشند تا اتکا پذیر باشند.
زمانی که دادههای شما زیادتر از حد معمول میشود، تولید کنندههای شما بدون اینکه نگران بقیهی سیستم باشند میتوانند داده تولید کرده و در صف بگذارند. همچنین ابزارهای Message Queue معمولا به صورت افقی مقیاس پذیر هستند و اگر طول صف شما زیاد شد میتوانید سرورهای Message Queue را بیشتر کنید تا ظرفیت آن افزایش یابد. مصرف کننده ها و تولید کننده ها و حتی خود Message Queue میتوانند در زمان نیاز کم یا بیشتر شوند و این یعنی مقایس پذیری افقی برای مولفههای مختلف راحت تر به دست میآید.
استفاده از Message Queue ها باعث میشود که مولفههای مختلف به هم وابستگی نداشته باشند و بتوانند به صورت مستقل از هم کار کنند و این امر به صورت چشم گیری برنامهنویسی این مولفهها را سادهتر میکند. به جای اینکه در هر مولفه حجم زیادی کد برای ارتباط بین این مولفه با دیگر مولفهها بزنیم، میتوانیم تمرکز خود را بر روی بیزینس اصلی متمرکر کنیم و کمتر به بخش های حاشیهایی بپردازیم.
این ابزارها به دو بخش Point to point و publish subscribe تقسیم میشوند. در ارتباط نقطه به نقطه، یک تولیدکننده پیامهای خود را از طریق صف برای یک مصرف کنندهی دیگر ارسال میکند. ممکن است چندین مصرف کننده بر روی صف گوش دهند ولی فقط یکی از آنها این پیام را باید مصرف کند. به همین دلیل به این نوع ارتباط نقطه به نقطه میگویند.
از طرف دیگر Publish Subscribe به مدلی گفته میشود که پیام از طریق یک صف یا Topic به چندین مصرف کننده ارسال میشود. این Topic لینکی بین تولید کننده و مصرفکنندهها است.
کافکا یکی از ابزارهای Message Queue معروف در این حوزه است که در ابتدا توسط LinkedIn توسعه داده شده و سپس به بنیاد آپاچی اهدا شده است. کافکا بیشتر از مدل PubSub تبعیت میکند. هدف از کافکا داشتن صفی با کارایی و throughput بالا بوده است و به همین دلیل از کافکا در سیستمهایی که نیاز به stream processing دارند زیاد استفاده میشود. در این ابزار به هر صف Topic میگوییم. هر تاپیک به تعدادی partition تقسیم میشود و پیام ها بین این پارتیشنها تقسیم میشوند. پیامها درون هر پارتیشن ترتیب دارند ولی در یک تاپیک و بین پارتیشن های مختلف ترتیبی وجود ندارد. تولید کننده ها پیامهای خود را به تاپیک میفرستند و مصرف کننده ها میتوانند روی یک یا چند تاپیک گوش دهند و پیامهای مختلفی را دریافت کنند.
از دیگر ابزارهای معروف در این حوزه میتوان به RabbitMQ اشاره کرد. این ابزار در سال 2004 به صورت متنباز به بازار ارائه شده است و از پروتوکلهای مختلفی مثل AMQP، MQTT و STOMP پشتیبانی میکند. در RabbitMQ مفهومی به اسم Exchange و routing وجود دارد که این مفاهیم در کافکا وجود ندارند. در RabbitMQ میتوان برای پسامهای مختلف Route های مختلفی تعریف کرد تا به دست مصرف کننده برسند. همچنین از مزیت های RabbitMQ میتولن به داشتن UI تحت وب و کاملی اشاره کرد که تمامی اقدامات لازم در ان در دسترس است.
شرکت سحاب پرداز یکی از شرکتهای داخل ایران است که به صورت حرفهایی بر روی کلانداده کار میکند و سالهاست که از نسخههای مختلف Kafka و در ابعاد مختلف استفاده میکند. برای راهاندازی و یا بهینه سازی کافکا میتوانید با گروه مشاوران سحاب ارتباط برقرار کنید.
یکی دیگر از شرکتهایی که خدمات Message Queue ارائه میدهد، ابرآروان است. در ابر آروان شما میتوانید به راحتی کافکا یا RabbitMQ را راهاندازی کنید. همچنین در بلاگ این شرکت توضیحات خوبی برای این تکنولوژيها آورده شده است.
در این مقاله به معرفی Message Queue ها و کاربردهای آنها پرداختیم. سپس مزیت استفاده از Message Queue را برشمردیم و در نهایت دوتا از معروف ترین Message Queue های موجود را معرفی کردیم.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.
https://www.instaclustr.com/blog/rabbitmq-vs-kafka/
https://medium.com/tech-sauce/introduction-to-message-queuing-4a7ab8968b59
https://betterprogramming.pub/introduction-to-message-queue-with-rabbitmq-python-639e397cb668