حالت موضوع RabbitMQ در گولانگ (Golang) به حالت مسیریابی (Direct) شبیه است، با بزرگترین تفاوت در این است که پارامترهای مسیریابی در حالت موضوع، از تطابق مبهم پشتیبانی میکنند. نوع تبادل برای حالت موضوع 'topic' است.
معماری حالت موضوع به صورت زیر است:
توجه: اگر با حالت موضوع RabbitMQ آشنا نیستید، لطفاً ابتدا بخش حالت موضوع RabbitMQ را مطالعه کنید.
1. آموزش پیشنیاز
لطفاً بخشهای زیر را به ترتیب مطالعه کنید:
- بخش مفاهیم پایه RabbitMQ
- بخش حالت موضوع RabbitMQ
- بخش پیادهسازی الگوی انتشار/اشتراک گذاری RabbitMQ برای Golang
توجه: از آنجا که بخش انتشار/اشتراک گذاری Golang RabbitMQ از قالبهای کد کامل استفاده میکند، فقط تعریف تبادل و پارامترهای مسیریابی برای حالتهای دیگر RabbitMQ متفاوت است. بنابراین، فقط کد کلیدی نشان داده شده است.
2. تعریف تبادل موضوع
err = ch.ExchangeDeclare(
"tizi365_topic", // نام تبادل، باید یکتا باشد
"topic", // نوع تبادل
true, // دائمی
false, // خودکار حذف شود
false, // داخلی
false, // بدون انتظار
nil, // آرگومانها
)
3. ارسال پیامها
// محتوای پیام
body := "سلام از Tizi365.com!"
// ارسال پیام
err = ch.Publish(
"tizi365_topic", // نام تبادل
"www.tizi365.com", // پارامتر مسیریابی، پارامتر حیاتی که تعیین میکند پیام شما به کدام صف ارسال میشود
false, // اجباری
false, // فوری
amqp.Publishing {
ContentType: "text/plain", // نوع محتوای پیام، اینجا متن ساده است
Body: []byte(body), // محتوای پیام
})
4. مصرف پیامها
4.1. اتصال تبادل
// تعریف صف برای عملیات
q, err := ch.QueueDeclare(
"", // نام صف، اگر پُر نشود به صورت تصادفی تولید میشود
false, // صف دائمی
false, // حذف در صورت عدم استفاده
true, // انحصاری
false, // بدون انتظار
nil, // آرگومانها
)
// اتصال صف به تبادل مشخص
err = ch.QueueBind(
q.Name, // نام صف
"*.tizi365.com", // پارامتر مسیریابی، پارامتر حیاتی که با استفاده از کاراکتر واژهای * یک کلمه را مطابقت میدهد، اگر از کاراکتر # استفاده شود، میتواند با چند کلمه مطابقت داشته باشد
"tizi365_topic", // نام تبادل، باید با تبادل تعریف شده توسط فرستنده پیام یکسان باشد
false,
nil)
4.2. پردازش پیامها
// ایجاد یک مصرفکننده
msgs, err := ch.Consume(
q.Name, // مرجع به نام صف بالا
"", // نام مصرفکننده، اگر پُر نشود به صورت خودکار تولید میشود
true, // تأیید خودکار به صف که پیام پردازش شده است
false, // انحصاری
false, // بدون جهانی بودن
false, // بدون انتظار
nil, // آرگومانها
)
// حلقه برای مصرف پیامها در صف
for d := range msgs {
log.Printf("پیام دریافت شد=%s", d.Body)
}