ویرگول
ورودثبت نام
محمدصادق دهقان
محمدصادق دهقاندانشجوی کارشناسی ارشد نرم‌افزار دانشگاه شهید بهشتی. عاشق برنامه‌نویسی
محمدصادق دهقان
محمدصادق دهقان
خواندن ۷ دقیقه·۵ سال پیش

آشنایی با Message Queue و کاربردهای آن

مقدمه

اگر در زمینه‌ی سیستم‌های توزیع‌‌شده کار کرده باشید حتما اسم صف و Message Queue به گوشتان خورده است. امروزه نقش Message Queue ها در نرم‌افزارهای بزرگ و توزیع شده بسیار پررنگ شده است به گونه‌ایی که اکثر شرکت‌های بزرگ نرم‌افزاری از جمله Google، LinkedIn و ... از Message Queue های مختلفی استفاده می‌کنند یا 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 استفاده‌های مختلفی دارند. یکی از استفاده‌های آن‌ها برای زمانی است که سرعت تولید داده با سرعت پردازش‌ آنها یکسان نیست و ممکن است زمان‌هایی سرعت تولید از مصرف بیشتر شود. در چنین سناریوهایی از 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 ارتباط غیرهمزمان را برای ما فراهم می‌کنند که به این معناست که سرویس‌های مختلف با صف و با Message Queue ارتباط برقرار می‌کنند نه با یکدیگر و این بدین معناست که وضعیت و سرعت یکی از سرویس‌ها بر دیگری تاثیر ندارد. هیچ سرویسی در سیستم هیچ وقت stall نمی‌شود و منتظر دیگیری نمی‌ماند و این یعنی جریان داده‌ی ما بهینه شده است.

اتکاپذیری بیشتر

Message Queue ها داده‌ی ما را ثبت و ذخیره می‌کنند و این باعث می‌شود که اگر سرویسی در دسترس نبود داده‌ی آن از دست نرود و از طرفی تولید کننده متوجه نشود. همین باعث افزایش دسترس پذیری و اتکا پذیری می‌شود و تحمل خطا در سیستم ما را افزایش می‌دهد. حتی خود Message Queue و پیام‌ها نیز می‌توانند redundancy داشته باشند تا اتکا پذیر باشند.

مقیاس پذیری بیشتر

زمانی که داده‌های شما زیادتر از حد معمول می‌شود، تولید کننده‌های شما بدون اینکه نگران بقیه‌ی سیستم باشند می‌توانند داده تولید کرده و در صف بگذارند. همچنین ابزارهای Message Queue معمولا به صورت افقی مقیاس پذیر هستند و اگر طول صف شما زیاد شد می‌توانید سرورهای Message Queue را بیشتر کنید تا ظرفیت آن افزایش یابد. مصرف کننده ها و تولید کننده ها و حتی خود Message Queue می‌توانند در زمان نیاز کم یا بیشتر شوند و این یعنی مقایس پذیری افقی برای مولفه‌های مختلف راحت تر به دست می‌آید.

جداسازی مولفه‌ها(decoupling)

استفاده از Message Queue ها باعث می‌شود که مولفه‌های مختلف به هم وابستگی نداشته باشند و بتوانند به صورت مستقل از هم کار کنند و این امر به صورت چشم گیری برنامه‌نویسی این مولفه‌ها را ساده‌تر می‌کند. به جای اینکه در هر مولفه حجم زیادی کد برای ارتباط بین این مولفه با دیگر مولفه‌ها بزنیم، می‌توانیم تمرکز خود را بر روی بیزینس اصلی متمرکر کنیم و کمتر به بخش های‌ حاشیه‌ایی بپردازیم.

انواع Message Queue ها

این ابزارها به دو بخش Point to point و publish subscribe تقسیم می‌شوند. در ارتباط نقطه به نقطه، یک تولیدکننده پیام‌های خود را از طریق صف برای یک مصرف کننده‌ی دیگر ارسال می‌کند. ممکن است چندین مصرف کننده بر روی صف گوش دهند ولی فقط یکی از آن‌ها این پیام را باید مصرف کند. به همین دلیل به این نوع ارتباط نقطه به نقطه می‌گویند.

از طرف دیگر Publish Subscribe به مدلی گفته می‌شود که پیام از طریق یک صف یا Topic به چندین مصرف کننده ارسال می‌شود. این Topic لینکی بین تولید کننده و مصرف‌کننده‌ها است.

معرفی ابزارهای معروف این حوزه

Kafka

کافکا یکی از ابزارهای Message Queue معروف در این حوزه است که در ابتدا توسط LinkedIn توسعه داده شده و سپس به بنیاد آپاچی اهدا شده است. کافکا بیشتر از مدل PubSub تبعیت می‌کند. هدف از کافکا داشتن صفی با کارایی و throughput بالا بوده است و به همین دلیل از کافکا در سیستم‌هایی که نیاز به stream processing دارند زیاد استفاده می‌شود. در این ابزار به هر صف Topic می‌گوییم. هر تاپیک به تعدادی partition تقسیم می‌شود و پیام ها بین این پارتیشن‌ها تقسیم می‌شوند. پیام‌ها درون هر پارتیشن ترتیب دارند ولی در یک تاپیک و بین پارتیشن های مختلف ترتیبی وجود ندارد. تولید کننده ها پیام‌های خود را به تاپیک می‌فرستند و مصرف کننده ها می‌توانند روی یک یا چند تاپیک گوش دهند و پیام‌های مختلفی را دریافت کنند.

RabbitMQ

از دیگر ابزارهای معروف در این حوزه می‌توان به 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

معماری_نرم_افزار_بهشتی
۶
۰
محمدصادق دهقان
محمدصادق دهقان
دانشجوی کارشناسی ارشد نرم‌افزار دانشگاه شهید بهشتی. عاشق برنامه‌نویسی
شاید از این پست‌ها خوشتان بیاید