โหมดหัวข้อของ RabbitMQ ภาษา Golang คล้ายกับโหมดเส้นทาง (Direct) โดยความแตกต่างที่สำคัญคือพารามิเตอร์ในการเส้นทางในโหมดหัวข้อรองรับการจับคู่ที่ไม่แน่นอน ประเภทแลกเปลี่ยนสำหรับโหมดหัวข้อคือ 'topic'。
สถาปัตยกรรมของโหมดหัวข้อเป็นดังนี้:
หมายเหตุ: หากคุณไม่คุ้นเคยกับโหมดหัวข้อของ RabbitMQ โปรดอ่านส่วน โหมดหัวข้อของ RabbitMQ ก่อน。
1. บทช่วยสอนที่ต้องการ
กรุณาอ่านส่วนต่อไปนี้ตามลำดับ:
- ส่วน แนวคิดพื้นฐานของ RabbitMQ
- ส่วน โหมดหัวข้อของ RabbitMQ
- ส่วน การประยุกต์ใช้รูปแบบการเผยแพร่/สับสนี้ของ Golang RabbitMQ
หมายเหตุ: เนื่องจากส่วนของ Golang 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)
}