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.
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.