علی رضانسب
علی رضانسب
خواندن ۵ دقیقه·۳ سال پیش

Message Queue

این بار میخوام فهم خودمو از صف پیام ها (یا Message Queue) با شما به اشتراک بذارم. اگه جایی به نظرتون بد یا اشتباه گفته شده خوشحال میشم در بخش نظرات بهم بگید. همچنین اگر تجربه جالب یا ارزشمندی از ابزار های این حوزه دارید در نظرات با ما سهیم شید

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

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

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

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

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


جداسازی و مقیاس پذیری

جداسازی نشان می‌دهد که یک بخش از یک سیستم چقدر به بخش دیگری از سیستم متکی است. جداسازی فرآیند جداسازی توابع است به گونه‌ای که آنها بیشتر خودکفا باشند.


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


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




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


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


صف پیام - یک مورد استفاده ساده

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


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


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



ابزار ها

آپاچی کافکا :

آپاچی کافکا یک پلتفرم متن باز هست که توسط بنیاد نرم افزار آپاچیبا اسکالا و جاوا نوشته شده. هدف این پروژه ارائه یک پلتفرم قدرتمند با تاخیر کم واحد ویکپارچه برای ویرایش اطلاعات ورودی به آن در مقیاس واقعی است


RabbitMQ

اگر شروع به بررسی یک راه حل مبتنی بر صف کنید، CloudAMQP میزبانی صف پیام را با RabbitMQ ارائه می دهد. RabbitMQ یک میان افزار متن باز پیام گرا است که پروتکل صف پیام پیشرفته (AMQP) را پیاده سازی می کند. AMQP دارای ویژگی هایی مانند صف بندی، مسیریابی، قابلیت اطمینان و امنیت است. اطلاعات بیشتر در مورد CloudAMQP را اینجا بخوانید.

«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»

منابع :


https://www.cloudamqp.com/blog/what-is-message-queuing.html


message queueمعماری‌نرم‌افزار‌بهشتی
شاید از این پست‌ها خوشتان بیاید