نمط توجيه RabbitMQ بلغة Golang
النمط الذي يتم فيه توجيه الرسائل في RabbitMQ يوسع نمط توزيع التبليغ بناءً على أساس نمط النشر-الاشتراك. نوع التبادل لنمط التوجيه هو مباشر، وهو أيضًا التبادل الافتراضي لـ RabbitMQ. في الأقسام السابقة، لم يتم استخدام تبادل صريح، ولكن التبادل الأساسي المستخدم في الواقع كان تبادل مباشر.
نصيحة: إذا كنت غير ملم بقواعد نمط التوجيه، يُرجى قراءة نمط توجيه RabbitMQ.
1. البرنامج التعليمي الأساسي
الرجاء قراءة الفصل حول نمط نشر-اشتراك لـ Golang RabbitMQ أولاً. في الأساس، يتم تنفيذ وسائط العمل المختلفة لـ RabbitMQ باستخدام أنواع مختلفة من التبادلات. الكود تقريبًا هو نفسه، والفرق الرئيسي يكمن في تعريف التبادل. لذا، بمجرد فهم نمط النشر-الاشتراك، تُصبح باقي الأنماط بسيطة جدًا.
2. تعريف تبادل مباشر
err = ch.ExchangeDeclare(
"tizi365_direct", // اسم التبادل، يجب أن يكون فريدًا
"direct", // نوع التبادل
true, // متين
false, // يُمحى تلقائيًا
false, // داخلي
false, // No-wait
nil, // وسيطات
)
3. إرسال الرسائل
// محتوى الرسالة
body := "مرحبًا Tizi365.com!"
// إرسال الرسالة
err = ch.Publish(
"tizi365_direct", // التبادل (اسم التبادل)
"blog", // مفتاح التوجيه، وهو المعامل الحاسم الذي يحدد إلى أي طابور ستُرسل رسالتك
false, // إجباري
false, // فوري
amqp.Publishing {
ContentType: "text/plain", // نوع محتوى الرسالة، في هذه الحالة، نص عادي
Body: []byte(body), // محتوى الرسالة
})
4. استقبال الرسائل من قبل المستهلك
4.1. ربط التبادل
// تعريف الطابور الذي سيتم التعامل معه
q, err := ch.QueueDeclare(
"", // اسم الطابور، إذا لم تتم تحديده، سيتم إنشاء واحد عشوائيًا
false, // طابور متين
false, // يُمسح عند عدم الاستخدام
true, // حصري
false, // No-wait
nil, // وسيطات
)
// ربط الطابور بالتبادل المحدد
err = ch.QueueBind(
q.Name, // اسم الطابور
"blog", // مفتاح التوجيه، إذا تطابق مع المعامل المحدد لتوجيه الرسالة، سيتم تسليم الرسالة إلى الطابور الحالي
"tizi365_direct", // اسم التبادل، يجب أن يكون متسقًا مع التبادل المحدد في طرف إرسال الرسالة
false,
nil)
4.2. استهلاك الرسائل
// إنشاء مستهلك
msgs, err := ch.Consume(
q.Name, // مرجع لاسم الطابور السابق
"", // اسم المستهلك، إذا لم يُملأ، سيتم إنشاء واحد عشوائيًا
true, // الاعتراف تلقائيًا بالرسائل التي تمت معالجتها بواسطة الطابور
false, // حصري
false, // No-local
false, // No-wait
nil, // Args
)
// حلقة لاستهلاك الرسائل في الطابور
for d := range msgs {
log.Printf("تم استقبال الرسالة=%s", d.Body)
}