RabbitMQ لا تدعم بشكل أصلي الرسائل المؤجلة. حاليًا، تشمل التنفيذات الرئيسية استخدام مبادلة الرسائل الميتة + نظام TTL للرسائل أو إضافة البرنامج المساعد rabbitmq-delayed-message-exchange.
حالات الاستخدام للاصفائية المؤجلة
- السيناريوهات التي تتطلب نوافذ زمنية لإنتاج واستهلاك الرسائل. على سبيل المثال، في معاملات التجارة الإلكترونية، هناك سيناريو حيث يتم إغلاق الطلبات إذا لم يتم استكمال الدفع خلال فترة مهلة. في هذه الحالة، يتم إرسال رسالة مؤجلة عند إنشاء الطلب. ستسلم هذه الرسالة إلى المستهلك بعد 30 دقيقة، ويحتاج المستهلك إلى التحقق مما إذا تم دفع الطلب المقابل. إذا لم يتم الدفع، يتم إغلاق الطلب؛ إذا تم الدفع، يتم تجاهل الرسالة.
- السيناريوهات التي يتم تشغيل المهام المؤجلة بواسطة الرسائل. على سبيل المثال، إرسال رسائل تذكير للمستخدمين بعد فترة زمنية محددة.
مبادلة الرسائل الميتة + نظام TTL للرسائل
الفكرة الأساسية لهذا النهج هو إنشاء طابور دون مستهلكين واستخدام وقت انتهاء الرسالة (TTL). عند انتهاء صلاحية الرسالة، تصبح رسالة ميتة، تُوجه إلى مبادلة الرسائل الميتة، ثم إلى طابور الرسائل الميتة، الذي يمكن استهلاكه.
في هذا النهج، يكون وقت انتهاء صلاحية الرسالة هو وقت التأخير للرسالة. على سبيل المثال، إذا تم تعيين وقت TTL للرسالة إلى 30 ثانية وليس هناك مستهلكين للطابور، ستنتهي صلاحية الرسالة بعد 30 ثانية وتصبح رسالة ميتة، والتي سيتم التعامل معها من قبل طابور الرسائل الميتة.
لتنفيذ هذا النهج، يجب ضبط الخصائص كما هو موضح في البرامج التعليمية التاليتين:
حلاً بإضافة الرسالة المؤجلة
1. تثبيت البرنامج المساعد
مستودع GitHub لبرنامج الرسالة المؤجلة في RabbitMQ:
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).
رؤوس الرسائل := make(map[string]interface{})
// ضبط وقت تأخير الرسالة باستخدام رأس الرسالة، بالميلي ثانية
رؤوس الرسائل["x-delay"] = 6000
err = ch.Publish(
"delay.queue", // اسم المبادلة
"", // معامل التوجيه
false,
false,
amqp.Publishing{
Headers: رؤوس الرسائل، أنواع الرسائل: "نص بسيط"
Body: []byte(body),
})
ملاحظة: إذا كنت تستخدم خدمة طابور الرسائل في Alibaba Cloud مباشرة، يمكنك ضبط وقت التأخير باستخدام خاصية رأس الرسالة (التأخير) دون تثبيت البرنامج المساعد. فقد قامت Alibaba Cloud بتوسيع RabbitMQ بالفعل لهذا الغرض.