รูปแบบการเส้นทางของ 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)
}