RabbitMQ به طور طبیعی پشتیبانی از پیام‌های تأخیری را ارائه نمی‌دهد. در حال حاضر، پیاده‌سازی‌های اصلی شامل استفاده از یک تبادله نامه مرده + زمان زندگی پیام یا افزونه rabbitmq-delayed-message-exchange هستند.

موارد استفاده از صف‌های تأخیری

  • حالت‌هایی که نیاز به پنجره زمانی برای تولید و مصرف پیام وجود دارد. به عنوان مثال، در معاملات تجارت الکترونیک، حالتی وجود دارد که در آن اگر پرداخت در یک دوره زمانی تعیین‌شده انجام نشود، سفارشات بسته می‌شوند. در این حالت، یک پیام تأخیری ارسال می‌شود هنگامی که سفارش ایجاد می‌شود. این پیام 30 دقیقه بعد به مصرف‌کننده تحویل داده می‌شود و مصرف‌کننده باید بررسی کند که آیا سفارش مربوطه پرداخت شده است یا خیر. اگر پرداخت انجام نشده باشد، سفارش بسته می‌شود؛ اگر پرداخت انجام شده باشد، پیام نادیده گرفته می‌شود.
  • حالت‌هایی که وظایف تأخیری توسط پیام‌ها فعال می‌شوند. به عنوان مثال، ارسال پیام‌های یادآور به کاربران پس از گذشت یک دوره زمانی مشخص.

روش تبادله نامه مرده + زمان زندگی پیام

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

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

برای پیاده‌سازی این رویکرد، خصوصیات باید به مطابق دو آموزش زیر تنظیم شود:

راه‌حل افزونه پیام تأخیری

1. نصب افزونه

مخزن GitHub افزونه rabbitmq-delayed-message-exchange:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

فایل rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez را از بخش فایلهای منتشرشده در صفحه انتشار در GitHub دانلود کرده و فایل را در دایرکتوری افزونه RabbitMQ (دایرکتوری افزونه‌ها) قرار دهید.

توجه: شماره نسخه ممکن است با آنچه در این آموزش آمده است متفاوت باشد. اگر RabbitMQ شما آخرین نسخه است، به‌راحتی نسخه جدیدتر افزونه را انتخاب کنید.

2. فعال‌سازی افزونه

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

3. تعریف تبادله

خصوصیات سفارشی تبادله را با استفاده از x-delayed-type تنظیم کنید تا ارسال پیام‌های تأخیری را پشتیبانی کند.

props := make(map[string]interface{})
// پارامتر کلیدی برای پشتیبانی از ارسال پیام‌های تأخیری
props["x-delayed-type"] = "direct"

// تعریف تبادله
err = ch.ExchangeDeclare(
"delay.queue", // نام تبادله
"fanout",      // نوع تبادله
true,          // دائمی
false,
false,
false,
props,         // تنظیم خصوصیات
)

4. ارسال پیام‌های تأخیری

زمان تأخیر پیام را با استفاده از سربرگ پیام (x-delay) تنظیم کنید.

msgHeaders := make(map[string]interface{})
// تنظیم زمان تأخیر پیام با استفاده از سربرگ پیام، به صورت میلی‌ثانیه
msgHeaders["x-delay"] = 6000

err = ch.Publish(
"delay.queue", // نام تبادله
"",            // پارامتر مسیردهی
false,
false,
amqp.Publishing{
Headers: msgHeaders,   // تنظیم سربرگ‌های پیام
ContentType: "text/plain",
Body: []byte(body),
})

توجه: اگر از خدمات صف پیام RabbitMQ ابری Alibaba Cloud به صورت مستقیم استفاده می‌کنید، می‌توانید زمان تأخیر را با استفاده از ویژگی سربرگ پیام (تأخیر) بدون نیاز به نصب افزونه تنظیم کنید. علی‌بابا ابری که کارکرد RabbitMQ را برای این منظور گسترش داده است.