RabbitMQ چیست ؟ چرا از آن استفاده کنیم ؟

با پیشرفت دنیا ، جوامع راح حل های نیازشون رو بیشتر از همیشه سمت برنامه های نرم افزاری میبینند . ساده بگم تکنولوژی داره روز به روز پیشرفت میکنه و مردم دارند به سمت استفاده از نرم افزار ها برای حل مشکلات روزمره خود میرند.

با این اوصاف نرم افزار های ماهم نیاز به پیشرفت دارند . ولی این پیشرفت کار چندان ساده ای با روش های قدیمی توسعه نرم افزاری نیست .

RabbitMq یکی از اون سیستم هایی هست که ما نیاز داریم توی طراحی نرم افزار های مقیاس بزرگ و قابل توسعه از اون استفاده کنیم .
RabbitMQ سیستمی هست که به عنوان Message-Broker یا انتقال دهنده پیام بین سیستم های مختلف عمل میکنه که با استفاده از اون میتونیم پیام ها رو به خوبی صف بندی کنیم و بین سیستم های مختلف انتقال بدیم .

آسون ترش کنم یعنی ما میتونیم با استفاده از RabbitMQ بین سیستم های مختلف با سرور های مختلف و حتی زبان های مختلف ارتباط برقرار کنیم .

در ادامه با برخی اصطلاعات و مفاهیم در RabbitMQ آشنا میشویم .

تولید کننده ، ارسال کننده یا Producer

این بخش به عنوان ارسال کننده پیام ها در RabbitMQ عمل میکنه . یعنی پیام ها رو از سیستم های مختلف به صف های مورد نظری که برای پردازش تعین شده ارسال میکنه .

پیام هایی ارسالی میتونن از هرنوعی باشند . یعنی میتونند اطلاعات یک فرایند که روی حتی یک سرور دیگه اجرا میشه رو داشته باشند یا اینکه فقط یک پیام ساده باشند .

صف بندی یا Queueing

ما میتونیم RabbitMQ رو به عنوان queue manager (مدیریت کننده صف بندی) نیز معرفی کنیم . یعنی پیام های ارسالی از سوی سیستم های مختلف به صف هایی که از قبل تعریف شده متصل میشند و منتظر پردازش میمونند .

هر صف برای یک وظیفه مشخص ساخته میشه . به عنوان مثال یک صف فقط وظیفه صف بندی پیام های Log که از سیستم های مختلف ارسال میشه رو برعهده داره.

صف بندی پیام ها در RabbitMQ
صف بندی پیام ها در RabbitMQ


مصرف کننده ، دریافت کننده یا Consumer

این بخش به عنوان دریافت کننده و بهتر بگم شنونده پیام ها عمل میکنه . وظیفه اصلی این بخش اینه که به صف هایی که تعیین شده نگاه میکنه و اگر پیامی برای پردازش بود دونه دونه پیام هارو از صف برمیداره و پردازش میکنه .

مبدل یا Exchanger

پیام ها به صورت مستقیم از تولید کننده ها به صف ها ارسال نمیشود . بلکه در این بین از مبدل ها عبور میکنن . هر مبدل وظیفه اش اینه که با استفاده از Binding و Route-Key ها پیام ها رو به صف های مختص خودش ارسال بکند .

مبدل ها سه نوع هستند :

  • مستقیم - Direct : پیام ها رو به صورت مستقیم به صف مربوطه هدایت میکنه
  • موضوع - Topic : پیام ها رو از طریق شباهت Routing-Pattern ها به صف های مورد نظر هدایت میکنه
  • متعصب - Fanout : پیام ها رو به تمام صف هایی که بهش متصل هستند ارسال میکنه


مثال برای درک بهتر :

شما فرض کنید یک سیستم فروشگاهی دارید که میخواید بعد از خرید برای مشتری با استفاده از سیستم ایمیلینگ یک فاکتور رو ایمیل کنید و همینطور در سیستم حسابداری میخواید این خرید ثبت بشه و از طرفی هم میخواد اطلاعات خرید کاربر رو با استفاده از سیستم لاگینگ لاگ کنید تا بعدا بتونید روش آنالیز و داده کاوی کنید .

اگر در سیستم های قدیمی بخوایم این پیاده بشه باید شما تموم این عملیات و logic هایی که گفته شد رو درست بعد از خرید ثبت کنید . که این خود کلی بار اضافه روی سیستم میاره و باعث کندی عملیات و درخواست میشه .

ولی شما میتونید با استفاده از RabbitMQ عملیات ذکر شده رو به صورت پیام های جداگانه در صف های جداگانه ارسال کنید تا پردازش بشه . و دیگه نیازی به اجرای اون روی منطق خرید شما نباشه . و هر سیستم با استفاده از Consumer مربوط به صف خودش پیام هارو برمیداره و پردازش میکنه .

این یکی از مزیت های RabbitMQ محسوب میشه .

یک مثال هم از طریق تصویر ببینیم :)


چند تا نکته راجب RabbitMQ و میکروسرویس :

  • شما میتونین از RabbitMQ در طراحی نرم افزار های میکروسرویس استفاده کنید . ازش به عنوان یک Api Gateway برای ارتباط با میکروسرویس های متعدد استفاده میشه .
  • دیگه نیازی نیست شما برای توسعه یک بخش برای مثال بخش حسابداری کل سیستم رو توسعه بدید و دوباره استقرار داده بشه فقط کافیه میکروسرویس مربوط به هربخش توسعه داده بشه .
  • میکروسرویس ها میتونن با تیم های جداگونه و با زبان های جداگونه نوشته بشوند .
  • اگر تعداد درخواست های شما از میزان پردازش سرور بیشتر بود دیگر نیازی به افزایش سخت افزار سرور مثل نرم افزار های قدیمی نیست و فقط کافیه Consomer های موجود برای هر صف رو افزایش بدهیم و روی سرور های جداگونه اجرا کنیم .
  • استفاده از RabbitMQ و میکروسرویس پیچیدگی های خاص خودش را داره و برای پروژه های در سطح متوسط به پایین توصیه نمیشه . چون خودش باعث پیچدگی میشود .

و خیلی مزیت ها و معایب دیگه که اگه به ذهنم بیاد حتما اضافش میکنم .


سعی کردم خیلی خودمونی و ساده قسمت های مختلف RabbitMQ رو توضیح بدم و در مقاله های بعدی پیاده سازیش روی NetCore و NestJs رو براتون مینویسم .

حتما اگ نظری داشتید و یا جمله تکمیل کننده بگید اضافه کنم.
لینکدین میتونین منو دنبال کنید .

لینک لینکدین