Chế độ chủ đề RabbitMQ của Golang tương tự với chế độ định tuyến (Direct), với điểm khác biệt lớn nhất là các tham số định tuyến trong chế độ chủ đề hỗ trợ định danh mờ. Loại trao đổi cho chế độ chủ đề là 'topic'.
Kiến trúc của chế độ chủ đề như sau:
Lưu ý: Nếu bạn không quen với chế độ chủ đề RabbitMQ, hãy đọc mục chế độ chủ đề RabbitMQ trước.
1. Hướng dẫn tiên quyết
Vui lòng đọc các mục sau theo thứ tự:
- Mục khái niệm cơ bản của RabbitMQ
- Mục chế độ chủ đề RabbitMQ
- Mục Triển khai Golang RabbitMQ mẫu xuất/nhập
Lưu ý: Vì mục xuất/nhập Golang RabbitMQ đã chứa các ví dụ mã hoàn chỉnh, chỉ có định nghĩa trao đổi và tham số định tuyến khác với các chế độ RabbitMQ khác. Do đó, chỉ hiển thị mã chính.
2. Khai báo trao đổi chủ đề
err = ch.ExchangeDeclare(
"tizi365_topic", // Tên trao đổi, cần phải duy nhất
"topic", // Loại trao đổi
true, // Bền vững
false, // Tự động xóa
false, // Nội bộ
false, // Không chờ
nil, // Đối số
)
3. Gửi tin nhắn
// Nội dung tin nhắn
body := "Xin chào Tizi365.com!"
// Gửi tin nhắn
err = ch.Publish(
"tizi365_topic", // Tên trao đổi
"www.tizi365.com", // Tham số định tuyến, tham số quan trọng quyết đị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, ở đây là văn bản thuần
Body: []byte(body), // Nội dung tin nhắn
})
4. Tiêu thụ tin nhắn
4.1. Buộc trao đổi
// Khai báo hàng đợi được thao tác
q, err := ch.QueueDeclare(
"", // Tên hàng đợi, sẽ được tạo ngẫu nhiên nếu không điền
false, // Hàng đợi bền vững
false, // Xóa khi không sử dụng
true, // Độc quyền
false, // Không chờ
nil, // Đối số
)
// Buộc hàng đợi với trao đổi cụ thể
err = ch.QueueBind(
q.Name, // Tên hàng đợi
"*.tizi365.com", // Tham số định tuyến, tham số quan trọng, sử dụng ký tự đại diện * để phù hợp với một từ, nếu sử dụng #, có thể phù hợp với nhiều từ
"tizi365_topic", // Tên trao đổi, cần phải khớp với trao đổi được xác định bởi người gửi tin nhắn
false,
nil)
4.2. Xử lý tin nhắn
// Tạo người tiêu thụ
msgs, err := ch.Consume(
q.Name, // Tham chiếu đến tên hàng đợi ở trên
"", // Tên người tiêu thụ, tự động tạo nếu không điền
true, // Tự động phê chuẩn cho hàng đợi rằng tin nhắn đã được xử lý
false, // Độc quyền
false, // Không cục bộ
false, // Không chờ
nil, // Đối số
)
// Lặp qua việc tiêu thụ tin nhắn trong hàng đợi
for d := range msgs {
log.Printf("Nhận tin nhắn=%s", d.Body)
}