در این پست قصد داریم درباره ی مفهموم Message Queue و استفاده ی آن در معماری های نرم افزار صحبت کنیم و همچنین ابزار های متن باز معروف و ابزار هایی ایرانی مربوط به آن را نیز معرفی کنیم.
صف بندی پیام ها به اپلیکیشن ا این اجازه را میدهد تا با فرستادن پیام به یکدیگر با هم ارتباط برقرار کنند. صف پیام ها یک فضای موقت را برای ذخیره کردن و نگهداری پیام ها فراهم می کند که اگر برنامه ی مقصد مشغول انجام کار بود و یا وصل نبود، پیامش از بین نرود.
یک صف یک مسیر برای مواردی است که باید با ترتیب خاصی مدیریت شوند و نیاز به انتظار دارند. یک صف پیام، صفی از پیام ها است که توسط برنامه ی فرستنده ارسال شده اند و قرار است توسط گیرنده دریافت شوند. این صف شامل اشیائی میشود که باید پردازش شوند.
یک پیام یک داده است که بین فرستنده و گیرنده ی اپلیکیشن در حال گذر میاشد. به صورت پایه ای میتوند یک بایت از داده با یک مقدار سربار باشد. یک مثال از یک پیام میتواند دستوری برای شروع یک پردازش در سیستم باشد و یا میتواند اطلاعاتی در مورد پایان کار یک پردازش باشد و منجر به شروع هیچ کاری نشود.
یک معماری پایه از صفبندی ساده است؛ چند اپلیکیشن در سیستم به اسم پروسیجر وجود دارند که وظیفه ی آن ها ساخت پیام ها و رساندن آن ها به صف پیام ها میباشد. یک اپلیکیشن دیگر به عنوان مصرف کننده وجود دارد که به صف متصل شده و پیام هایی که درون آن وجود دارد را دریافت کرده و پردازش می کند. پیام ها در صف قرار داده میشوند و تا زمانی که مصرف کننده آن ها را بردارد و پردازش کند در صف ذخیره خواهند شد.
یک صف پیام یک پروتکل ارتباط غیر همگام را فراهم میکند که در واقع سیستمی است که یک پیام را در صف پیام قرار می دهد و نیاز نیست سریعا پیامی دریافت کند تا بتواند به کار خود ادامه دهد. یکی از بهترین مثال های پروتکل صفبندی پیام ها می تواند مثال ایمیل باشد که فرد فرستده ایمیل پس از ارسال منتظر دریافت پاسخ در لحظه نمیشود و دیگر فرایند های خود میپردازد. این روش از مدیریت پیام ها فرستنده و گیرنده را از برقراری ارتباط مستقیم به صورت همزمان با صف معاف میکند.
وابستگی در سیستم به میزان اتکایی است که یک قسمت از سیستم به قسمت دیگر آن دارد و سپس قطع کردن وابستگی به عملی میگویند که میزان وابستگی یک قسمت از سیستم به قسمت دیگر را از بین میبیرد و خود قسمت مورد نظر می تواند به عنوان یک واحد خود مختار عمل کند.
یک سیستم غیر وابسته زمانی به دست می آید که چند سیستم بتوانند با هم ارتباط برقرار کنند بدون این که به یکدیگر متصل باشند. سیستم میتواند به طور کامل به کار خود ادامه دهد و از انجام کار دیگر سیستم ها غیر مطلع باشد. غیر وابسته بودن یک سیستم یکی از نشانه هایی است که خبر از ساختار بندی خوب سیستم مورد نظر میدهد و تثبیت آن راحت تر است.
اگر یک پردازش در یک سیستم غیر وابسته دچار خطا در پردازش پیام از صف شود دیگر پیام ها همچنان میتوانند به صف اضافه شوند و زمانی که سیستم به حالت عادی برگشت میتواند آن ها را پردازش کند. همچنین میتوان از یک صف پیام استفاده کرد تا پردازشی را به تاخیر انداخت؛ به طور مثال یک تولید کننده یک پیام را در یک صف پیام قرار میدهد و در زمان مشخص شده مصرف کننده ها شروع به پردازش پیام ها از صف میکنند. یک پیام صف میتواند ذخیره و سپس ارسال شود.
به جای ساختن یک اپلیکیشن بزرگ، به صرفه تر است که با از بین بردن وابستگی میان قسمت های مختلف اپلیکیشن و استفاده از صف پیام، به صورت غیر همگام میان قسمت های مختلف ارتباط برقرار کنیم. این امر این قابلیت را برای قسمت های مختلف فراهم میکند که به صورت خودکفا پیشرفت و رشد خود را داشته باشند و وابسته به تغییرات در قسمت های دیگر سیستم نباشند. یا تا وقتی که بتوان از طریق صف پیام میان آن ها ارتباط برقرار کرد حتی میتواند آن ها را در زبان های مختلف و توسط تیم های مختلف نوشت و به روز رسانی کرد.
یک صف پیام در سیستم باعث جداسازی و غیروابسته کردن پردازش ها از یکدیگر میشود. پردازش اول نیاز ندارد که حتما پردازش های دیگر را صدا بزند، نوتیفیکیشن ارسال کند و یا از جریان ایجاد شده از پردازش های دیگر پیروی کند. پردازش های دیگر نیز میتوانند به صورت مجزا کار خود را انجام دهند و هر زمان که امکانش وجود داشت پیام را از صف بردارند. این روش از مدیریت کردن پیام ها باعث راحت تر کردن تثبیت و مقیاس پذیری سیستم میشود.
تصور کنید یک وب سرویسی دارید که تعداد زیادی درخواست را در هر ثانیه دریافت میکند، در حالی که هیچ پیامی نباید از دست برود و همه ی درخواست ها باید توسط متدی پردازش شوند که گذردهی بالایی دارد. به زبانی دیگر سرویس شما باید دسترس پذیری بالایی داشته باشد و همیشه آماده ی دریافت درخواست جدید باشد و توسط پردازش قبلی مسدود نشود.
در این حالت قرار دادن یک صف در میان وب سرویس و سرویس پردازش یک رویکر ایده آل می باشد. وب سرویس میتواند پیام شروع پردازش را در یک صف قرار داده و پردازش دیگر این هارا به ترتیب انتخاب کرده و پردازش کند. این دو پردازش از یکدیگر مجزا هستند و به علت وابستگی نداشتن نیاز نیست که منتظر یکدیگر باشند. اگر در زمان بسیار کم تعداد زیادی پردازش دریافت شود، این سیستم میتواند تمامی آن ها را پردازش کند. صف درخواست ها را در خود نگه می دارد حتی اگر تعداد آن ها زیاد شود. حال اگر این کسب و کار پیشرفت کند و مقیاسش بزرگتر شود و لازم باشد که مقیاس سیستم نیز بیشتر شود. صرفا در این سناریو لازم است تعداد مصرف کننده های بیشتری برای درخواست های ورودی در این سمت صف قرار دهیم.
پنج تا از بهترین نرم افزار های متن باز بر پایه ی message queue(پیام های در صف) :
با اتکا به بخش های قبل می دانیم نرم افزار های message queue برای کنترل ارتباطات آسنکرون استفاده میشود. این صف یک پروتکل آسنکرون برای ارتباط داده ها داخل سیستم فراهم میکند. که در این بخش به معرفی 5 نرم افزار پر کاربرد میپردازیم.
هنگامی که تعداد زیادی تسک آسنکرون وجود دارد، برای مدیریت این تسک ها از نرم افزار های متن باز MQ استفاده میشود. ارتباط آسنکرون به این معنی است که نقاط پایانی ( endpoints ) که پیام ها را تولید و مصرف میکند. فقط با سرویس صف در تعامل هستند و با یکدیگر تعامل ندارند. MQ یک پروتکل آسنکرون بین فرستنده و گیرنده فراهم میکند تا بتوانند از راه دور و در هر زمانی، باهم ارتباط داشته باشند. پیام ها بسته به نیاز فرستنده میتوانن شامل "درخواست ها"، "پاسخ ها"، و "هشدار ها" باشند.
واسطه پیام متن باز، بخش مهمی از سیستم نرم افزاری برای ارسال و دریافت پیام ها با فرمت text و یا سایر فرمت هاست. سرویس بر پایه MQ به نرم افزار ها اجازه میدهد تا بین سرویس های مختلف درون یک سیستم با یکدیگر در ارتباط باشند. همچنین هنگامی که برنامه مقصد مشغول انجام task دیگری هست و اصطلاحا busyاست، MQیک حافظه موقت ایجاد میکند تا پیام از دست نرود. اگر بخواهیم عمیق تر به این موضوع نگاهی بیندازیم، واسط پیام، برای فرستادن و دریافت تمامی پیام ها از سیستم صف (LIFO) استفاده میکند. پیام هایی که درون صف هستند، در داخل یک بافر سبک نگهداری میشوند و سپس و در پسزمینه وجود دارند.
محبوب ترین "واسط پیام" ها و بهترین نرم افزار های بر پایه ی صف در سال 2021 عبارتند از:
نرم افزار Kafka یک سیستم پیام رسان متن باز و یک واسط صف قوی است که حتی در پلتفرم های stream هم به کار برده میشود و توانایی کنترل حجم زیادی از پیام را دارد. در واسط پیام Kafkaپیام ها در دیسک نگهداری میشوند و اجازه میدهد تا پیام ها را از یک نقطه(point) به هر جای دیگر به صورت یکپارچه ارسال کنید.در صف پیام Apache پیام ها از طریق کل دسته های kafka تکثیر و تکرار میشوند تا از هرگونه عملیات ناخواسته مانند از دست رفتن داده ها جلوگیری شود. پلتفرم Kafka برای کنترل real timeبودن streamingها و همچنین برای پاسخ سریع به داده ها ساخته شد.
این نرم افزار نسبت به سایر همتایان خود مانند ActiveMQ و RabbitMQ عملکرد بهتری دارد.
به عنوان یک سیستم پیام رسان داخلی توسط Linked-in برای کنترل کردن 1.4 تریلیون پیام در روز ساخته شد. Kafka برای اجرای صف بهترین و مناسب ترین پلتفرم است زیرا با استفاده سکوئنشیال از عملیات I/Oکارایی را افزایش میدهد. و همچنین برای بیگ دیتا هم بهترین انتخاب است چرا که میتواند با وجود تعداد محدودی از منابع، به throughput بالایی دست یابد، میلیون ها پیام در ثانیه!
نرم افزار RabbitMQ گسترده ترین و محبوب ترین و همچنین به نظر اکثر افراد بهترین "واسط پیام" متن باز است.(واسطی برای پیامرسانی). که با زبان برنامه نویسی Erlang نوشته شده و توسط بنیاد Pivotal Software Foundation پشتیبانی میشود. به application های شما یک پلتفرم مشترک و مکانی امن برای ارسال و دریافت پیام می دهد. ویژگی های این برنامه شامل : کارایی، قابلیت اطمینان، دردسترس بودن، خوشه بندی و فدراسیون و غیره است.RabbitMQ رابط کاربری(UI) ساده و کاربردی دارد که این امکان را به شما میدهد تا پیام های خود را نظارت و مدیریت کنید.
این برنامه را میتوان از سایت اصلی خود کمپانی دانلود کرد و برای تمامی انواع سیستم عامل ها دردسترس است.توصیه میشود تا از پلاگین های سرویس پیام مبتنی بر صف RabbitMQ استفاده شود تا هم کارایی افزایش یابد و هم حجم کاری message broker ها کاهش یابد و راحت تر load شود. مهم ترین پلاگین، پلاگین مدیریتی است که به صورت دستی فعال میشود. پلاگین مدیریتی به کاربران کمک میکند تا کاربران بتوانند با استفاده از واسط کاربری گرافیکی (GUI) بهتر پیام ها را مدیریت کنند. همچنین کمک میکند تا بتوان آمار های مربوط به پیام ها را بهتر مشاهده و دسته بندی کرد و یک نمای کلی از تمام عملیاتی که در صف رخ داده در اختیار میگذارد.
نرم افزار Celery یک سیستم پیامرسان بر پایه صف است که متن باز، انعطاف پذیر و قابل اطمینان است و برای پردازش پیام ها هنگامی که مقدار زیادی پیام وجود دارد استفاده میشود.این برنامه با تمرکز بر real time بودن فرآیند ها، امکان زمانبندی تسک ها را نیز فراهم میکند.Celery تحت مجوز BSD لایسنس شده است. celery صف فرآیندی آسنکرون دارد که به آن "صف کار" هم گفته میشود، که بر پایه distributed message passing است. واحد های اجرا یا فرآیند تسک ها، به صورت کانکارنت در یک نود تک کاره و یا نود چند پردازه ای اجرا میشوند. تسک های celery یا به صورت آسنکرون در پس زمینه و یا به صورت سنکرون اجرا میشوند.
این برنامه با استفاده از پایتون نوشته شده اما پروتکل های آن به هر زبانی قابل پیاده سازی هستند. و برای microservice ها بهترین گزینه است. و هر روزه برای سیستم هایی مانند اینستاگرام برای پردازش میلیون ها تسک استفاده میشود. و همچنین میتواند با سایر زبان های برنامه نویسی که از "webhook" ها استفاده میکنند، کار کند.
PHP کلاینت هایی مانند Go client – Node.js client – Ruby-client را RCelery مینامند.Celery متن باز است و در گیت ها 17.6 هزار ستاره کسب کرده و 4هزار fork از روی آن انجام شده است.
نرم افزار NSQ متن باز و حافظه توزیع شده بلادرنگ به سبک جدید است، بهترین MQ که طراحی شده برای مقیاس بالا مناسب باشد. به زبان برنامه نویسی Go نوشته شده است و میتواند بیلیون ها پیام در مقیاس بزرگ را هر روز کنترل کند.سیستم اعلان NSQ بر پایه پیام توزیع شده و ساختار توپولوژی غیر متمرکز عمل میکند. یکی از خصوصیات این سیستم این است که تک نقطه خرابی ( single point of failure ) ندارد. این خاصیت باعث افزایش تحمل خطا و همچنین افزایش قابلیت در دسترس بودن ( availability ) و در نتیجه باعث میشود که پیام ها با کیفیت بهتری به مقصد برسند.
این نرم افزار یک محصول کامل، با کیفیت عالی است که به راحتی پیکربندی میشود. تمامی پیکربندی ها و deployment ها در خط فرمان مشخص شده اند و compiled binaries have no runtime dependencies.
برای به حداکثر رساندن انعطاف پذیری NSQ ، فرمت های داده میتواند به فرمت JSON ، MsgPack ، protocol buffers و یا هر فرمت دیگری باشد.
دارای کتابخانه های رسمی Go و python و همچنین سایر کتابخانه های client است. همچنین NSQ سه جزء مهم دارد : 1 - nsqd -3 nsqlookupd -2 nsqadmin
همانطور که اشاره شد NSQ متن باز است و در GitHub 19.9 هزار ستاره دریافت کرده و 2.6 هزار fork از روی آن انجام شده است.
نرم افزار Redisson پیشرفته ترین و ساده ترین Redis Java client با ویژگی های In-Memory data grid می باشد. به راحتی میتوان کار با آن را یاد گرفت و ابراز نظارت MQ را دارد به طوری که نیازی به یاد گرفتن هیچ فرمانی ( commands ) از Redis برای پیکربندی Redisson نیست. همچنین نیازمند اشیاء مبتنی بر Redis ، کالکشن ها، قفل ها و سنکرون کردن و همچنین سرویسی برای توزیع کردن application ها در پلتفرم جاوا می باشد.
تسک ها در جاوا ممکن است به صورت موازی و با پیاده سازی توزیع شده بر پایه ی Redis اجرا شوند.( به همراه ExecutorService و ScheduledExecutorService )
پروژه متن باز Redisson در GitHub 16.9 هزار ستاره کسب کرده و 4.1 هزار fork از روی آن انجام شده است.
نرم افزار Chabokan یکی از ارائه دهنده های سرویس message queue در کنار سرویس های ابری دیگر می باشد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است
https://www.cloudamqp.com/blog/what-is-message-queuing.html
https://en.wikipedia.org/wiki/Message_queue