توسعه دهنده ارشد نرم افزار
RabbitMQ چیست ؟ چرا از آن استفاده کنیم ؟
با پیشرفت دنیا ، جوامع راح حل های نیازشون رو بیشتر از همیشه سمت برنامه های نرم افزاری میبینند . ساده بگم تکنولوژی داره روز به روز پیشرفت میکنه و مردم دارند به سمت استفاده از نرم افزار ها برای حل مشکلات روزمره خود میرند.
با این اوصاف نرم افزار های ماهم نیاز به پیشرفت دارند . ولی این پیشرفت کار چندان ساده ای با روش های قدیمی توسعه نرم افزاری نیست .
RabbitMq یکی از اون سیستم هایی هست که ما نیاز داریم توی طراحی نرم افزار های مقیاس بزرگ و قابل توسعه از اون استفاده کنیم .
RabbitMQ سیستمی هست که به عنوان Message-Broker یا انتقال دهنده پیام بین سیستم های مختلف عمل میکنه که با استفاده از اون میتونیم پیام ها رو به خوبی صف بندی کنیم و بین سیستم های مختلف انتقال بدیم .
آسون ترش کنم یعنی ما میتونیم با استفاده از RabbitMQ بین سیستم های مختلف با سرور های مختلف و حتی زبان های مختلف ارتباط برقرار کنیم .
در ادامه با برخی اصطلاعات و مفاهیم در RabbitMQ آشنا میشویم .
تولید کننده ، ارسال کننده یا Producer
این بخش به عنوان ارسال کننده پیام ها در RabbitMQ عمل میکنه . یعنی پیام ها رو از سیستم های مختلف به صف های مورد نظری که برای پردازش تعین شده ارسال میکنه .
پیام هایی ارسالی میتونن از هرنوعی باشند . یعنی میتونند اطلاعات یک فرایند که روی حتی یک سرور دیگه اجرا میشه رو داشته باشند یا اینکه فقط یک پیام ساده باشند .
صف بندی یا Queueing
ما میتونیم RabbitMQ رو به عنوان queue manager (مدیریت کننده صف بندی) نیز معرفی کنیم . یعنی پیام های ارسالی از سوی سیستم های مختلف به صف هایی که از قبل تعریف شده متصل میشند و منتظر پردازش میمونند .
هر صف برای یک وظیفه مشخص ساخته میشه . به عنوان مثال یک صف فقط وظیفه صف بندی پیام های Log که از سیستم های مختلف ارسال میشه رو برعهده داره.
مصرف کننده ، دریافت کننده یا Consumer
این بخش به عنوان دریافت کننده و بهتر بگم شنونده پیام ها عمل میکنه . وظیفه اصلی این بخش اینه که به صف هایی که تعیین شده نگاه میکنه و اگر پیامی برای پردازش بود دونه دونه پیام هارو از صف برمیداره و پردازش میکنه .
مبدل یا Exchanger
پیام ها به صورت مستقیم از تولید کننده ها به صف ها ارسال نمیشود . بلکه در این بین از مبدل ها عبور میکنن . هر مبدل وظیفه اش اینه که با استفاده از Binding و Route-Key ها پیام ها رو به صف های مختص خودش ارسال بکند .
مبدل ها سه نوع هستند :
- مستقیم - Direct : پیام ها رو به صورت مستقیم به صف مربوطه هدایت میکنه
- موضوع - Topic : پیام ها رو از طریق شباهت Routing-Pattern ها به صف های مورد نظر هدایت میکنه
- متعصب - Fanout : پیام ها رو به تمام صف هایی که بهش متصل هستند ارسال میکنه
مثال برای درک بهتر :
شما فرض کنید یک سیستم فروشگاهی دارید که میخواید بعد از خرید برای مشتری با استفاده از سیستم ایمیلینگ یک فاکتور رو ایمیل کنید و همینطور در سیستم حسابداری میخواید این خرید ثبت بشه و از طرفی هم میخواد اطلاعات خرید کاربر رو با استفاده از سیستم لاگینگ لاگ کنید تا بعدا بتونید روش آنالیز و داده کاوی کنید .
اگر در سیستم های قدیمی بخوایم این پیاده بشه باید شما تموم این عملیات و logic هایی که گفته شد رو درست بعد از خرید ثبت کنید . که این خود کلی بار اضافه روی سیستم میاره و باعث کندی عملیات و درخواست میشه .
ولی شما میتونید با استفاده از RabbitMQ عملیات ذکر شده رو به صورت پیام های جداگانه در صف های جداگانه ارسال کنید تا پردازش بشه . و دیگه نیازی به اجرای اون روی منطق خرید شما نباشه . و هر سیستم با استفاده از Consumer مربوط به صف خودش پیام هارو برمیداره و پردازش میکنه .
این یکی از مزیت های RabbitMQ محسوب میشه .
یک مثال هم از طریق تصویر ببینیم :)
چند تا نکته راجب RabbitMQ و میکروسرویس :
- شما میتونین از RabbitMQ در طراحی نرم افزار های میکروسرویس استفاده کنید . ازش به عنوان یک Api Gateway برای ارتباط با میکروسرویس های متعدد استفاده میشه .
- دیگه نیازی نیست شما برای توسعه یک بخش برای مثال بخش حسابداری کل سیستم رو توسعه بدید و دوباره استقرار داده بشه فقط کافیه میکروسرویس مربوط به هربخش توسعه داده بشه .
- میکروسرویس ها میتونن با تیم های جداگونه و با زبان های جداگونه نوشته بشوند .
- اگر تعداد درخواست های شما از میزان پردازش سرور بیشتر بود دیگر نیازی به افزایش سخت افزار سرور مثل نرم افزار های قدیمی نیست و فقط کافیه Consomer های موجود برای هر صف رو افزایش بدهیم و روی سرور های جداگونه اجرا کنیم .
- استفاده از RabbitMQ و میکروسرویس پیچیدگی های خاص خودش را داره و برای پروژه های در سطح متوسط به پایین توصیه نمیشه . چون خودش باعث پیچدگی میشود .
و خیلی مزیت ها و معایب دیگه که اگه به ذهنم بیاد حتما اضافش میکنم .
سعی کردم خیلی خودمونی و ساده قسمت های مختلف RabbitMQ رو توضیح بدم و در مقاله های بعدی پیاده سازیش روی NetCore و NestJs رو براتون مینویسم .
حتما اگ نظری داشتید و یا جمله تکمیل کننده بگید اضافه کنم.
لینکدین میتونین منو دنبال کنید .
مطلبی دیگر از این انتشارات
ضد الگوها در توسعه نرمافزار چه هستند؟
مطلبی دیگر از این انتشارات
اصول SOLID
مطلبی دیگر از این انتشارات
آموزش استفاده از API در PHP