تصور کنید یک فروشگاه آنلاین وجود دارد که هر بار مشتری سفارشی ثبت میکند، باید:
- پرداخت پردازش شود.
- موجودی بهروزرسانی شود.
- ایمیل تأیید ارسال شود.
انجام فوری همه این مراحل، بهویژه در زمانهای پرترافیک، ممکن است تجربه مشتری را کند کند.
در این حالت، تعداد زیادی رویداد برنامه وجود دارد و نمیتوانیم همه آنها را بهطور همزمان پردازش کنیم.
البته میتوانیم سرورهایمان را برای پردازش این تعداد زیاد رویداد مقیاسدهی کنیم، اما اگر نیازی به پردازش فوری همه آنها نباشد، بهتر است این رویدادها را در صف قرار دهیم و بعداً آنها را مدیریت کنیم.
معماری پایه صف پیام
صف پیام، یک مؤلفه پایدار است که در حافظه ذخیره شده و از ارتباطات غیرهمزمان پشتیبانی میکند. این صف بهعنوان یک بافر عمل کرده و درخواستهای غیرهمزمان را توزیع میکند.
معماری پایه ساده است: سرویسهای ورودی که تولیدکننده یا ناشر نامیده میشوند، پیامهایی ایجاد و به صف پیام ارسال میکنند. سایر سرویسها که مصرفکننده یا مشترک نامیده میشوند، به صف متصل شده و اقداماتی را که در پیامها تعریف شده انجام میدهند.
در دنیای واقعی، ممکن است چندین برنامه به صف پیام ارسال کرده و چندین سرور نیز از آن پیامها استفاده کنند.
بازگشت به مثال
در این مثال، به جای انجام فوری هر وظیفه، میتوانید آن را به انتهای صف اضافه کنید. سپس از این صف، پیامها به سرورها ارسال میشوند.
- سفارش ثبت شد: جزئیات سفارش بهعنوان یک پیام ثبت میشود.
- پیام ارسال شد: پیام به صف اضافه میشود.
- مصرفکنندهها پردازش میکنند: فرآیندهای جداگانه (مصرفکننده) پیامها را از ابتدای صف میخوانند و وظایف را انجام میدهند.
همچنین، سرور تأیید میکند که یک پیام دریافت و پردازش شده و صف آن پیام را حذف میکند تا دوباره ارسال نشود.
مزایای استفاده از صف پیام
مزیت اصلی این است که این رویدادها از هم جدا میشوند و صف پیام به ما اجازه میدهد این رویدادها را بهصورت غیرهمزمان پردازش کنیم. میتوانیم آنها را تا زمان آمادهسازی برای پردازش در صف نگه داریم.
با استفاده از صف پیام، تولیدکننده میتواند پیام را به صف ارسال کند حتی اگر مصرفکننده در دسترس نباشد.
همچنین مصرفکننده میتواند پیامها را از صف بخواند حتی اگر تولیدکننده در دسترس نباشد.
یکی دیگر از مزایای عالی دیگر آن پایایی است. اگر صف دچار خرابی شود، دادهها از دست نمیروند زیرا در دیسک ذخیره میشوند، نه در RAM.
اگر یک مصفرکننده در حین پردازش یک پیام دچار خرابی شود، مشکلی نیست! پیام همچنان در صف باقی میماند و توسط مصرفکننده دیگری پردازش خواهد شد.
صف پیام همچنین امکان مقیاسپذیری را فراهم میکند. اگر تعداد زیادی سفارش دریافت کنید، فقط طول صف بیشتر میشود. میتوانید مصرفکنندههای بیشتری اضافه کنید تا بار اضافی را مدیریت کنند، بدون اینکه بر عملکرد وبسایت تأثیر بگذارد.
انواع مختلف صفها
چندین نوع صف پیام وجود دارد. رایجترین آنها عبارتند از:
- FIFO (اول وارد، اول خارج): درست مانند یک صف معمولی، پیامها به ترتیبی که وارد میشوند، پردازش میشوند. این برای مواردی مانند پردازش پرداخت اهمیت دارد.
- صفهای اولویتدار: ممکن است برخی پیامها مهمتر از بقیه باشند. میتوانید به آنها اولویت دهید تا زودتر پردازش شوند.
روشهای Push در مقابل Pull
برخی صفها منتظر میمانند تا مصرفتکننده پیامها را درخواست کنند (صفهای مبتنی بر Pull)، در حالی که دیگران پیامها را بهطور فعال به مصرفکننده ارسال میکنند (صفهای مبتنی بر Push).
مثالها
در اینجا چند مثال محبوب از صفهای پیام آورده شده است:
- RabbitMQ: یک صف چندمنظوره که برای موارد استفاده مختلف مناسب است.
- Kafka: برای ظرفیت بالا و جریان دادههای بلادرنگ طراحی شده است. برای مواردی مانند ثبت وقایع و معماریهای مبتنی بر رویداد بسیار مناسب است.
- Amazon SQS (Simple Queue Service): یک سرویس صف مبتنی بر ابر کاملاً مدیریتشده که توسط AWS ارائه میشود. این سرویس مقیاسپذیر و قابل اعتماد است و ویژگیهایی مانند صفهای تأخیری و صفهای پیامهای معیوب ارائه میدهد.