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

امیرحسین بیگدلو 5 ماه قبل

امروزه توسعه دهندگان برنامه های کاربردی با معماری سرویس های کوچک(microservice) را بر سیستم یکپارچه(monolithic)، ترجیح میدهند. برای درک دلیل این امر، باید نگاهی دقیق تر به صف بندی پیام(Message Queuing) و مزایای استفاده از RabbitMQ به عنوان واسطه پیام(message broker) در معماری میکروسرویس بیندازیم. این مقاله به همبستگی بین سیستم میکروسرویس و استفاده از صف پیام برای پاسخ به این سوالات می پردازد: چرا باید از RabbitMQ در معماری میکروسرویس استفاده کنیم؟ در چه زمان‌هایی باید از rabbitmq استفاده کنیم؟

 

دوره پیشنهادی: دوره آموزش RabbitMQ

 

# مهاجرت از مونولیث به میکروسرویس

 

شما احتمالاً ایده خوبی از تفاوت بین این دو نوع معماری سیستم دارید، اما به عنوان یک یادآوری، اجازه دهید تفاوت های اصلی را بررسی کنیم:

تفاوت معماری میکروسرویس و مونولیث

 

معماری یکپارچه(monolith) اغلب بزرگ، پیچیده و محکم به هم پیوسته است و تمام عملکردها در یک سیستم واحد وجود دارد. این نوع معماری دارای چندین نقطه ضعف است، اولین مورد این است که نگهداری از آن دشوار است. ایجاد تغییرات کوچک در معماری یکپارچه ممکن است کل سیستم را تحت تأثیر قرار دهد، که می تواند طیف وسیعی از مسائل را ایجاد کند. به جای آن معماری میکروسرویس، این مسئله را با تفکیک عملکرد به اجزای مستقل حل می کند. این کار افزودن، تغییر یا حذف عملکردها را بدون تأثیر بر سایر قسمتهای معماری آسان می کند.

 

مثلا؛ اگر یک فروشگاه خرید آنلاین ناگهان نتواند رسیدها را از طریق ایمیل ارسال کند. شاید فرآیند مسئول این کار خراب شود اما، در سایر قسمت های سیستم مشکلی ایجاد نمی کند. وظایف/پیامهای ارسال شده به سرویس خرد "ارسال رسید ایمیل" به سادگی در صف قرار می گیرند تا سرویس خرد دوباره فعال شود و بقیه فروشگاه می تواند به طور معمول در تمام مدت به کار خود ادامه دهد.

 

 

# مزایای استفاده از میکروسرویس ها چه هستند؟

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

 

 

# یک سرویس خرد چیست؟

یک سرویس خرد سرویسی است که معمولاً فقط برای یک هدف واحد وجود دارد، مستقل از نمونه ها و سرویس های دیگر است. هنگام ایجاد یک برنامه کاربردی به سبک معماری میکروسرویس، رویکرد توسعه یک برنامه واحد متشکل از دو یا چند سرویس کوچک (سرویس های کوچک) است. هر میکروسرویس به طور جداگانه توسعه می یابد و برنامه نهایی مجموع همه سرویس های میکرو است.

 

ویدیو پیشنهادی: آشنایی با میکرو سرویس ها

 

# سرویس‌های خرد چگونه به یکدیگر متصل میشوند؟

سرویس های کوچک یا ماژول ها از یکدیگر جدا شده اند اما هنوز قادر به برقراری ارتباط هستند. وابستگی های متقابل معمولی برای معماری میکروسرویس است، بدین معنا که هیچ سرویسی نمی تواند بدون دریافت کمک از سرویس های دیگر انجام دهد. روشهای متفاوتی برای اتصال سرویس های خرد وجود دارد، مانند:

  • کارگزارها مانند rabbitmq
  • تماس از راه دور(RPC)
  • REST API

 

ارتباط بین میکروسرویس ها

 

 

# منظور از صف بندی پیام چیست؟

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

 

معماری صف بندی پیام ها در میکروسرویس

 

 

# کنترل کردن ارتباط با کارگزار پیام

یک کارگزار پیام به عنوان یک واسطه برای خدمات خرد عمل می کند و پیامها را از یک برنامه (تولیدکنندگان) دریافت می کند و آنها را برای انجام کار به دیگران (مصرف کنندگان) تحویل می دهد. مثلا؛ با کارگزار پیام RabbitMQ، پیامها مستقیماً در صف منتشر نمی شوند. در عوض، تولیدکنندگان پیامی را به صرافی(exchange) ارسال می کند. وظیفه صرافی این است که پیامهای برنامه های تولید کننده را بپذیرد و آنها را به صف های صحیح پیام هدایت کند. پیامها در صف می مانند تا زمانی که مصرف کننده آنها را برداشته و آنها را حذف کند.

 

چند کارگزار پیام مختلف برای انتخاب وجود دارد. هنگام انتخاب بین کارگزاران، باید سعی کنید الزامات خود را مشخص کنید. RabbitMQ و Apache Kafka دو کارگزار پیام متن باز هستند.

 

مقاله پیشنهادی: دسترسی پذیری چیست؟

 

# rabbitmq در معماری میکروسرویس

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

 

+ ویژگی‌های rabbimtq

 

RabbitMQ یک کارگزار پیام قابل اعتماد منبع باز است. از سال 2007 در بازار بوده و بخشی از نرم افزار Pivotal 2013 شد. این نرم افزار به طور مداوم به روز می شود و بهبود می یابد. RabbitMQ دارای یک جامعه قوی و تیم اصلی بسیار فعال است که ویژگی های اضافی، پیشرفت ها و افزونه های مفید را تولید می کند. مجوز RabbitMQ هرگز تغییر نکرده است (نوامبر 2019).

 

RabbitMQ از چندین پروتکل استاندارد مانند AMQP ، MQTT ، STOMP و غیره پشتیبانی می کند که بطور طبیعی AMQP 0.9.1 را پیاده سازی می کند. توانایی RabbitMQ در پشتیبانی از پروتکل های پیام استاندارد استاندارد شده به این معنی است که می توان از آن در بسیاری از سناریوهای مختلف استفاده کرد و به شما این امکان را می دهد که کارگزار RabbitMQ خود را با هر بروکر مبتنی بر AMQP جایگزین کنید.

 

RabbitMQ توسط تعداد زیادی از شرکت ها در صنایع مختلف مورد استفاده قرار می گیرد و مورد اعتماد شرکت های بزرگ (Zalando ، WeWork ، Wunderlist ، Bloomberg و دیگر شرکت ها) است. همه متکی بر معماری مبتنی بر ریز سرویس هستند.

 

RabbitMQ کاربر پسند است و با پیروی از این بهترین شیوه های RabbitMQ، به راحتی می توان تنظیمات را متناسب با هدف مورد نظر تغییر داد. RabbitMQ به زبان Erlang نوشته شده است و بیشترین کارگزار پیام باز در جهان است، به این معنی که این یک کارگزار خوب و محکم است.

 

کارگزار RabbitMQ مقیاس پذیر و انعطاف پذیر است. تیم شما فقط باید تولیدکنندگان و مصرف کنندگان را در ارسال و دریافت پیام به/از صف حفظ کند. تحت بار سنگین، اگر صف بزرگتر شود، واکنش استاندارد این است که مصرف کنندگان بیشتری را اضافه کرده و کار را به موازات هم قرار دهیم. این یک روش مقیاس بندی ساده و موثر است.

 

مقاله پیشنهادی: دوآپس(devops) چیست؟

 

# چه زمان‌هایی از صف بندی پیام استفاده کنیم؟

حالا ممکن است فکر کنید، "صف پیام در کجای در معماری من جا می گیرد"؟ پاسخ ساده و سریع زمانی است که:

 

- هر زمان که یک کار بخشی از یک تراکنش اساسی کاربر نباشد و/یا نتایج روی پاسخ کاربر تأثیر نگذارد، این یک کار عالی برای صف پیام است.

 

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

 

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

 

در زیر چند مثال آمده که در شرایط مختلف از کارگزار پیام استفاده شده است.

 

+ مقیاس بندی تصاویر

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

 

در املاک و مستغلات، دلالان به تعداد زیادی عکس نیاز دارند تا بتوانند ملک را به طور موثر بازاریابی کنند و نظر خریدار را جلب کنند. از طریق این پلتفرم، هنگامی که یک دلال تصویر جدیدی از دارایی را اضافه می کند، کار مقیاس بندی آن به اندازه کاربر پسند به RabbitMQ واگذار می شود. صف پیام وظیفه مقیاس بندی تصویر را ادامه می دهد تا زمانی که مصرف کننده آن را گرفته، مقیاس بندی کند و تصویر در اندازه جدید و کارآمد در وب سایت منتشر شود.

 

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

 

 

+ از مونولیث به میکروسرویس

یکی از سریعترین خدمات پارکینگ دیجیتالی، پارکستر، معماری یکپارچه خود را به سرویس های خرد و جدا شده سریعتر تقسیم کرده است. پارکستر مانند نتفلیکس در ابتدا زندگی خود را به عنوان یکپارچه برای اثبات مدل تجاری خود آغاز کرد. آنها به سرعت متوجه شدند که این نوع سیستم - جایی که کل برنامه در یک واحد، با یک پایگاه کد و یک سیستم ساخته شده است - کارآمد یا موثر نیست.

 

مقاله پیشنهادی: چرا زبان‌های برنامه نویسی نام‌های عجیبی دارند؟

 

+ آنالیز فایل

Softonic، پورتال کشف نرم افزار و برنامه، بیش از 100 میلیون کاربر در هر ماه دارد و روزانه بیش از 2 میلیون دانلود را انجام می دهد. پورتال دارای جریان مداوم رویدادها و دستورات بین خدماتی است که ارائه می دهد و RabbitMQ صف انتخابی پیام است که به معماری سریع و موثر Softonic معروف است.

 

کاربران فایل ها را در پلتفرم Softonic بارگذاری می کنند، جایی که از نظر ویروس اسکن می شوند، و اطلاعات مربوط به فایل قبل از توزیع به سایر کاربران جمع آوری می شود. بلافاصله پس از موفقیت آمیز بودن بارگذاری، به کاربر اطلاع داده می شود. اطلاعات فایل، در قالب داده های باینری جدید، روی یک سرویس اختصاصی قرار دارد و یک اعلان به صف پیام ارسال می شود که اطلاعات آماده برای سایر سرویس ها وجود دارد. سرویس های دیگر این داده ها را کنترل می کنند، که مداوم است و در پایان فرآیند به وب سایت اضافه می شود.

 

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

 

 

+ پردازش pdf

یک برنامه وب به کاربران امکان می دهد اطلاعات را در یک وب سایت بارگذاری کنند. سایت این اطلاعات را مدیریت می کند و یک PDF ایجاد می کند و برای کاربر ایمیل می کند. رسیدگی به اطلاعات، تولید PDF و ارسال ایمیل در این مورد چند ثانیه طول می کشد و این یکی از دلایلی است که از صف پیام استفاده می شود.

 

 

+ ارسال پیام های پس زمینه بین کارگران سرور

FarmBot یک کیت سخت افزاری روباتیک منبع باز است که تعامل با پروژه های کشاورزی را به روشی کارآمد و سرگرم کننده امکان پذیر می کند. FarmBot از سنسورها و محرک های فیزیکی استفاده می کند که نیاز به یک روش ارتباطی بین باغ فیزیکی و نرم افزار دارد.

 

تماس های از راه دور یا الگوهای درخواست/پاسخ HTTP همیشه برای FarmBot کار نمی کند، جایی که دستگاه می تواند مجبور به انجام فعالیت های طولانی نظرسنجی شود و دائماً برای هرگونه تماس از راه دور از API درخواست کند. این امر مقیاس پذیری فوق العاده ای را برای برنامه وب ایجاد می کند و باعث ایجاد تجربه واقعی در زمان واقعی برای کاربران می شود.

 

به عنوان مثال ، هنگامی که FarmBot یک پیام توقف اضطراری دریافت می کند، باید بلافاصله پس از ایجاد دریافت شود نه اینکه از سیستم بخواهید دائماً API را برای آنها بررسی کند. مثالهای دیگر شامل فراخوانی از راه دور و همگام سازی داده در زمان واقعی است.

 

صف پیام در حال حاضر جزء مهمی از API وب FarmBot است و برای انجام کارهای مختلف از جمله:

 

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

 

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

 

به این فکر کنید که کارگزار پیام به عنوان یک برنامه چت ماشین به ماشین عمل می کند. هر بسته نرم افزاری با مجوز صحیح، از جمله REST API ، FarmBot OS یا سیستم عامل شخص ثالث ، می تواند پیامی را به هر موجود دیگری که در حال حاضر به کارگزار پیام متصل است ارسال کند.

 

مقاله پیشنهادی: چرا مردم نرم‌افزارهای open source میسازند؟

 

+ مدیریت پشتیبان گیری از دیتابیس

ElephantSQL (پایگاه داده PostgreSQL به عنوان یک سرویس) از صف هایی در معماری برای مدیریت پشتیبان روزانه استفاده می کند. یک بار در روز هزاران پیام "perform-database-backup" به صف اضافه می شود، یک پیام برای هر پایگاه داده. یکی دیگر از خدمات، عضویت در پیام ها و ایجاد نسخه پشتیبان است.

 

پشتیبان گیری همچنین می تواند در صورت درخواست از طریق API مشتری یا از طریق رابط وب ایجاد شود. این نسخه پشتیبان باید بلافاصله پس از ارسال درخواست در دسترس باشد - به عبارت دیگر، اولویت است. برای حل این مشکل، صف پیام شما باید بتواند پیامها را به نحوی اولویت بندی کند. در این مورد از RabbitMQ استفاده می شود. پیام "perform-database-backup" به همان صف اضافه می شود، اما این پیام اولویت پیام بیشتری نسبت به سایر درخواست ها دارد. پیام ارسال شده بلافاصله در سر صف قرار می گیرد.

 

 

# نتیجه گیری

نقطه مشترک موفقیت همه این داستان ها چیست؟ صف های پیام - جدا کردن فرایندهای فردی برنامه ها و مستقل نگه داشتن آنها از یکدیگر. یک فرایند هرگز نیازی به فراخوانی فرآیند دیگر یا تعامل با دیگری یا پیروی از هر چیزی جز جریان فرآیند خود ندارد. پیام به سادگی در صف قرار می گیرد و سیستم به طور مستقل به پردازش خود ادامه می دهد. این معماری جدا شده یک سیستم آسان برای نگهداری ایجاد می کند که مقیاس بندی آن نیز آسان است.

 

اگر مقاله بالا را دوست داشتید، پیشنهاد میکنیم به مطالب زیر هم سر بزنید:

مقایسه پایتون و نودجی‌اس

دوره های آموزش پروژه محور و پیشرفته پایتون

چقدر زمان میبرد تا پایتون را یاد بگیریم؟

دوره آموزش الگوریتم‌نویسی در پایتون

مطالب مشابه



مونگارد