รูปแบบการเส้นทางของ RabbitMQ ใน Golang
รูปแบบการเส้นทางใน RabbitMQ ขยายวิธีการส่งข้อมูลด้วยการกระจายตามหลักการการส่ง-รับทั่วไปเพิ่มเติม ประเภทของการกระจายสำหรับการเส้นทางคือแบบที่ถูกตรง ซึ่งเช่นเดียวกับการกระจายสำหรับ RabbitMQ ตามค่าเริ่มต้นด้วย ในส่วนก่อนหน้านี้ ไม่ได้ใช้การกระจายโดยตรง แต่การกระจายด้านล่างที่ใช้จริงๆ คือการกระจายไปทางตรง
เคล็ดลับ: หากคุณไม่คุ้นเคยกับกฎของรูปแบบการเส้นทาง โปรดอ่านเพิ่มเติมที่ รูปแบบการเส้นทางของ RabbitMQ ก่อน
1. บทช่วยเตรียม
โปรดอ่านบทเรื่อง การกระจาย-การรับสำหรับ Golang RabbitMQ ก่อน โดยพื้นฐานทางจุลภาค วิธีการทำงานต่างๆ ของ RabbitMQ ถูกนำมาใช้โดยหลายประเภทของการกระจาย โค้ดเหมือนกันโดยมีความแตกต่างส่วนใหญ่อยู่ที่คำจำกัดของการกระจาย ดังนั้น หลังจากที่เข้าใจแนวทางของการกระจาย-การรับแล้ว รูปแบบอื่นๆ ก็จะง่ายที่เหมาะสม
2. การประกาศเปลี่ยน
err = ch.ExchangeDeclare(
"tizi365_direct", // ชื่อการกระจาย ต้องเป็นเอกลักษณ์
"direct", // ประเภทการกระจาย
true, // ทนทาน
false, // อัตโนมัติลบ
false, // ภายใน
false, // ไม่รอ
nil, // อาร์กิวเมนต์
)
3. การส่งข้อความ
// เนื้อหาข้อความ
body := "สวัสดี Tizi365.com!"
// การผลักดันข้อความ
err = ch.Publish(
"tizi365_direct", // การกระจาย (ชื่อการกระจาย)
"บล็อก", // คีย์การเส้นทาง พารามิเตอร์ที่สำคัญเพื่อกำหนดว่าข้อความของคุณจะส่งไปที่คิวไหน
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_direct", // ชื่อการกระจาย ซึ่งต้องสอดคล้องกับการกระจายที่ถูกกำหนดที่ปลายของผู้ส่งข้อความ
false,
nil)
4.2. การบริโภคข้อความ
// สร้างผู้บริโภค
msgs, err := ch.Consume(
q.Name, // การอ้างอิงชื่อคิวก่อนหน้า
"", // ชื่อผู้บริโภค หากไม่ได้ระบุ ตัวเลือกจะได้รับการสร้างขึ้นแบบสุ่ม
true, // รับทราบข้อความโดยอัตโนมัติที่ถูกประมวลผลโดยอัตโนมัติจากคิว
false, // ที่เฉพาะ
false, // ไม่มีท้องถิ่น
false, // ไม่รอ
nil, // อาร์กิวเมนต์
)
// การวนเพื่อบริโภคข้อความในคิว
for d := range msgs {
log.Printf("ได้รับข้อความ=%s", d.Body)
}