Mẫu định tuyến RabbitMQ trong Golang
Mẫu định tuyến trong RabbitMQ mở rộng phương pháp đổi trả trao đổi trên cơ sở mẫu publish-subscribe. Loại trao đổi cho mẫu định tuyến là direct, cũng là trao đổi mặc định cho RabbitMQ. Ở các phần trước, không sử dụng trao đổi rõ ràng, nhưng trao đổi cơ bản đã sử dụng thực tế là trao đổi direct.
Mẹo: Nếu bạn chưa quen với các quy tắc của mẫu định tuyến, vui lòng đọc Mẫu Định Tuyến RabbitMQ.
1. Hướng dẫn tiên quyết
Vui lòng đọc chương về Mẫu Publish-Subscribe RabbitMQ cho Golang trước. Về cơ bản, các chế độ làm việc khác nhau của RabbitMQ được thực hiện bởi các loại trao đổi khác nhau. Mã gần như giống nhau, với sự khác biệt chính là định nghĩa của trao đổi. Do đó, một khi mẫu publish-subscribe được hiểu, các mẫu khác khá đơn giản.
2. Khai báo một trao đổi Direct
err = ch.ExchangeDeclare(
"tizi365_direct", // Tên trao đổi, cần phải là duy nhất
"direct", // Loại trao đổi
true, // Bền bỉ (durable)
false, // Auto xóa
false, // Nội bộ
false, // No-wait
nil, // Đối số
)
3. Gửi Tin Nhắn
// Nội dung tin nhắn
body := "Xin chào Tizi365.com!"
// Đẩy tin nhắn
err = ch.Publish(
"tizi365_direct", // Trao đổi (tên trao đổi)
"blog", // Khóa định tuyến, một tham số quan trọng xác định tin nhắn của bạn sẽ được gửi đến hàng đợi nào
false, // Bắt buộc
false, // Ngay lập tức
amqp.Publishing {
ContentType: "text/plain", // Loại nội dung tin nhắn, trong trường hợp này, là văn bản thuần
Body: []byte(body), // Nội dung tin nhắn
})
4. Người tiêu thụ Nhận Tin Nhắn
4.1. Ràng buộc Trao Đổi
// Khai báo hàng đợi để thao tác
q, err := ch.QueueDeclare(
"", // Tên hàng đợi, nếu không được chỉ định, một hàng đợi ngẫu nhiên sẽ được tạo ra
false, // Hàng đợi bền (durable)
false, // Xóa khi không sử dụng
true, // Độc quyền
false, // No-wait
nil, // Đối số
)
// Ràng buộc hàng đợi với trao đổi cụ thể
err = ch.QueueBind(
q.Name, // Tên hàng đợi
"blog", // Khóa định tuyến, nếu nó khớp với tham số định tuyến được chỉ định khi gửi tin nhắn, tin nhắn sẽ được gửi đến hàng đợi hiện tại
"tizi365_direct", // Tên trao đổi, cần phải khớp với trao đổi được xác định ở phía người gửi tin nhắn
false,
nil)
4.2. Tiêu thụ Tin Nhắn
// Tạo một người tiêu thụ
msgs, err := ch.Consume(
q.Name, // Tham chiếu đến tên hàng đợi trước đó
"", // Tên người tiêu thụ, nếu không điền, một người tiêu thụ ngẫu nhiên sẽ được tạo ra
true, // Tự động xác nhận tin nhắn được xử lý bởi hàng đợi
false, // Độc quyền
false, // No-local
false, // No-wait
nil, // Các tham số
)
// Lặp để tiêu thụ các tin nhắn trong hàng đợi
for d := range msgs {
log.Printf("Nhận tin nhắn=%s", d.Body)
}