نمط الـ topic في RabbitMQ لغة Golang مشابه لنمط التوجيه (Direct)، مع أكبر الفروق في أن معلمات التوجيه في نمط الـ topic تدعم المطابقة الضبابية. نوع التبادل exchange الخاص بنمط الـ topic هو "topic".
هناك بعض الأقسام التي يجب قراءتها بالترتيب:
- القسم الخاص بالمفاهيم الأساسية لـ RabbitMQ RabbitMQ basic concepts
- القسم الخاص بنمط الـ topic في RabbitMQ RabbitMQ topic mode
- القسم الخاص بتنفيذ نمط النشر/الاشتراك لـ RabbitMQ بلغة Golang Implementing Golang RabbitMQ publish/subscribe pattern
2. الإعلان عن تبادل (Exchange) بنمط الـ Topic
err = ch.ExchangeDeclare(
"tizi365_topic", // اسم التبادل (Exchange name)، يجب أن يكون فريدًا
"topic", // نوع التبادل (Exchange type)
true, // دائم (Durable)
false, // حذف تلقائي (Auto-deleted)
false, // داخلي (Internal)
false, // بدون انتظار (No-wait)
nil, // وسيطات (Arguments)
)
3. إرسال الرسائل
// محتوى الرسالة
body := "مرحبًا بكم في Tizi365.com!"
// نشر الرسالة
err = ch.Publish(
"tizi365_topic", // اسم التبادل (Exchange name)
"www.tizi365.com", // معلمة التوجيه (Routing parameter)، معلمة حاسمة تُحدد أي قائمة سيتم إرسال الرسالة إليها
false, // إلزامي (Mandatory)
false, // فوري (Immediate)
amqp.Publishing {
ContentType: "text/plain", // نوع محتوى الرسالة، هنا يكون نص عادي
Body: []byte(body), // محتوى الرسالة
})
4. استهلاك الرسائل
4.1. ربط التبادل
// الإعلان عن الصف (Queue) الذي سيتم التعامل معه
q, err := ch.QueueDeclare(
"", // اسم الصف (Queue name)، سيتم إنشاؤه تلقائيًا إذا لم يتم ملؤه
false, // صف دائم (Durable queue)
false, // الحذف عند عدم الاستخدام (Delete when unused)
true, // حصري (Exclusive)
false, // بدون انتظار (No-wait)
nil, // وسيطات (Arguments)
)
// ربط الصف بالتبادل المحدد
err = ch.QueueBind(
q.Name, // اسم الصف (Queue name)
"*.tizi365.com", // معلمة التوجيه (Routing parameter)، معلمة حاسمة، باستخدام الرمز البارز * للمطابقة لكلمة واحدة، إذا تم استخدام # ، يمكن أن يطابق كلمات متعددة
"tizi365_topic", // اسم التبادل (Exchange name)، يجب أن يتطابق مع التبادل الذي يتم تعريفه بواسطة مرسل الرسالة
false,
nil)
4.2. التعامل مع الرسائل
// إنشاء مستهلك
msgs, err := ch.Consume(
q.Name, // الإشارة إلى اسم الصف أعلاه
"", // اسم المستهلك، يتم إنشاؤه تلقائيًا إذا لم يتم ملؤه
true, // التقرير التلقائي إلى الصف بأن الرسالة تم التعامل معها
false, // حصري
false, // بدون محلي
false, // بدون انتظار
nil, // وسيطات
)
// تكرار استهلاك الرسائل في الصف
for d := range msgs {
log.Printf("Received message=%s", d.Body)
}