Chế độ làm việc Golang RabbitMQ, đạt được việc tiêu thụ song song bởi nhiều người tiêu dùng.

Golang work queue

Giải thích: P đại diện cho nhà sản xuất, C1 và C2 đại diện cho người tiêu dùng, và màu đỏ đại diện cho hàng đợi.

Mẹo: Mỗi tin nhắn chỉ có thể được tiêu thụ bởi một người tiêu dùng.

Trước khi học

Vui lòng đọc Hướng dẫn nhanh về Golang RabbitMQ trước để hiểu về các hoạt động cơ bản của Golang trên RabbitMQ. Nếu bạn không quen thuộc với RabbitMQ, vui lòng đọc các chương trước đó trước.

Tiêu thụ đồng thời

Golang chủ yếu sử dụng goroutines để thực hiện nhiều người tiêu dùng, dưới đây là cách thực hiện cho nhiều người tiêu dùng.

Mẹo: Đối với cách gửi thông điệp, vui lòng tham khảo Hướng dẫn nhanh về Golang RabbitMQ.

package main

import (
	"log"
	"time"

	"github.com/streadway/amqp"
)

// Xử lý lỗi
func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// Kết nối với RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Không thể kết nối đến RabbitMQ")
	defer conn.Close()

	// Tạo 5 người tiêu dùng thông qua goroutines
	for i := 0; i < 5; i++ {
		go func(number int) {
			// Tạo một kênh rabbitmq cho mỗi người tiêu dùng
			ch, err := conn.Channel()
			failOnError(err, "Không thể mở một kênh")
			defer ch.Close()

			// Khai báo hàng đợi để thao tác
			q, err := ch.QueueDeclare(
				"hello", // Tên hàng đợi
				false,   // Bền vững
				false,   // Xóa khi không sử dụng
				false,   // Độc quyền
				false,   // Không đợi
				nil,     // Đối số
			)
			failOnError(err, "Không thể khai báo một hàng đợi")

			// Tạo một người tiêu dùng
			msgs, err := ch.Consume(
				q.Name, // Tên hàng đợi cần thao tác
				"",     // Id độc nhất của người tiêu dùng, nếu không điền, một giá trị duy nhất sẽ được tạo tự động
				true,   // Tự động xác nhận tin nhắn (tức là tự động xác nhận rằng tin nhắn đã được xử lý)
				false,  // Độc quyền
				false,  // Không sử dụng cục bộ
				false,  // Không đợi
				nil,    // Đối số
			)
			failOnError(err, "Không thể đăng ký một người tiêu dùng")

			// Xử lý tin nhắn trong một vòng lặp
			for d := range msgs {
				log.Printf("[Số người tiêu dùng=%d] Nhận thông điệp: %s", number, d.Body)
				// Mô phỏng xử lý kinh doanh, ngủ trong 1 giây
				time.Sleep(time.Second)
			}
		}(i)
	}

	// Đợi goroutine chính để ngăn chương trình thoát
	forever := make(chan bool)
	<-forever
}

Mẹo: Bất kể loại trao đổi nào được sử dụng bởi RabbitMQ, các hàng đợi có thể có nhiều người tiêu dùng, và cách bắt đầu nhiều người tiêu dùng giống như ví dụ này.