Golang โหมดการทำงานของ RabbitMQ work mode, การบริโภคแบบพร้อมกันโดยการบริโภคที่เป็นขนาดขนาดมาก

Golang work queue

คำอธิบาย: P แทนผู้ผลิต, C1 และ C2 แทนผู้บริโภค, และสีแดงแทนคิว

เคล็ดลับ: แต่ละข้อความสามารถถูกบริโภคได้เพียงหนึ่งครั้งเท่านั้น

คำแนะนำก่อนการทำ

โปรดอ่าน Golang RabbitMQ Quick Start Tutorial ก่อนเพื่อที่จะเข้าใจการดำเนินการพื้นฐานของ Golang ใน RabbitMQ ถ้าคุณยังไม่คุ้นเคยกับ RabbitMQ โปรดอ่านบทก่อนหน้านี้ก่อน

การบริโภคแบบพร้อมกัน

Golang ใช้ goroutines เป็นหลักในการนำสมัยบริโภคตั้งแต่นี้เราได้แสดงการเข้าทำงานของผู้บริโภคต่างๆ ด้านล่างนี้

เคล็ดลับ: สำหรับวิธีการส่งข้อความ โปรดอ่าน Golang RabbitMQ Quick Start Tutorial.

package main

import (
	"log"
	"time"

	"github.com/streadway/amqp"
)

// การจัดการข้อผิดพลาด
func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// เชื่อมต่อกับ RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "เชื่อมต่อกับ RabbitMQ ล้มเหลว")
	defer conn.Close()

	// สร้าง 5 ผู้บริโภคผ่าน goroutines
	for i := 0; i < 5; i++ {
		go func(number int) {
			// สร้างช่อง rabbitmq สำหรับแต่ละผู้บริโภค
			ch, err := conn.Channel()
			failOnError(err, "เปิดช่องล้มเหลว")
			defer ch.Close()

			// ประกาศคิวที่จะทำงาน
			q, err := ch.QueueDeclare(
				"hello", // ชื่อคิว
				false,   // ทนทาน
				false,   // ลบเมื่อไม่ได้ใช้งาน
				false,   // ที่เป็นคุม, เฉพาะ
				false,   // ไม่รอ
				nil,     // อาร์กิวเม้นต์
			)
			failOnError(err, "ประกาศคิวล้มเหลว")

			// สร้างผู้บริโภค
			msgs, err := ch.Consume(
				q.Name, // ชื่อคิวที่จะทำงาน
				"",     // ไอดีผู้บริโภคเฉพาะ, ถ้าไม่กรอก จะสร้างค่าที่ไม่ซ้ำกันโดยอัตโนมัติ
				true,   // ตอบรับข้อความโดยอัตโนมัติ (หมายความว่ายืนยันอัตโนมัติว่าข้อความได้รับการประมวลผล)
				false,  // ที่เป็นคุม
				false,  // ไม่มีท้องท้อง
				false,  // ไม่รอ
				nil,    // อาร์กิวเม้นต์
			)
			failOnError(err, "ลงทะเบียนผู้บริโภคล้มเหลว")

			// ประมวลผลข้อความในลูป
			for d := range msgs {
				log.Printf("[หมายเลขผู้บริโภค=%d] ได้รับข้อความ: %s", number, d.Body)
				// จำลองการประมวลผลธุรกิจ, หน่วงเพื่อ 1 วินาที
				time.Sleep(time.Second)
			}
		}(i)
	}

	// แขวน goroutine หลักเพื่อหยุดโปรแกรมไม่ให้ออก
	forever := make(chan bool)
	<-forever
}

เคล็ดลับ: ไม่ว่าจะใช้ส่งข้อความแบบไหนก็ตามที่โดย RabbitMQ คิวสามารถมีผู้บริโภคได้หลายคน การเริ่มผู้บริโภคหลายคนก็เหมือนกับในตัวอย่างนี้นี้เช่นกัน