Mẫu Publish/Subscribe (Chế độ Phát sóng, Chế độ Fanout)
Chế độ FanoutExchange được sử dụng cho mẫu publish/subscribe trong RabbitMQ, nơi một tin nhắn được gửi bởi một nhà sản xuất sẽ được xử lý bởi nhiều hàng đợi người tiêu thụ. Kiến trúc được hiển thị như trong biểu đồ sau đây:
Rất lưu ý: Bất kể chế độ làm việc của RabbitMQ nào được sử dụng, sự khác biệt nằm ở loại trao đổi và các tham số định tuyến được sử dụng.
1. Các Bài Hướng Dẫn Tiền Đề
Vui lòng đọc các phần sau đây trước để hiểu về kiến thức liên quan:
- Khái niệm cơ bản về RabbitMQ
- Mẫu Publish/Subscribe trong RabbitMQ
- Hướng dẫn nhanh Java cho RabbitMQ (bắt buộc, vì các phần tiếp theo sẽ không sao chép mã, chỉ hiển thị mảnh mã chính)
2. Định nghĩa Trao đổi Fanout
Trong Spring AMQP, lớp FanoutExchange tương ứng với sự trao đổi Fanout. Chúng ta định nghĩa trao đổi thông qua một lớp cấu hình Spring Boot. ...... ...... (và các phần còn lại tương tự)
Câu lệnh đầu tiên là tốt nhất để đủ sự rõ ràng, hãy đảm bảo bạn đọc và hiểu hết các khái niệm cơ bản về RabbitMQ và mẫu Publish/Subscribe trước khi bạn tiến sâu vào việc triển khai.
4.2 Xác định Người Nghe Hàng Đợi
Xác định các người nghe tin nhắn thông qua chú thích RabbitListener để tiêu thụ tin nhắn từ các hàng đợi cụ thể.
package com.tizi365.rabbitmq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
// Làm cho lớp hiện tại được quản lý bởi Spring
@Component
public class DemoListener {
// Xác định một người nghe và chỉ định hàng đợi nào sẽ nghe bằng cách sử dụng tham số queues
@RabbitListener(queues = "tizi365.fanout.queue1")
public void receive1(String msg) {
System.out.println("Nhận tin nhắn từ hàng đợi 1 = " + msg);
}
// Xác định một người nghe và chỉ định hàng đợi nào sẽ nghe bằng cách sử dụng tham số queues
@RabbitListener(queues = "tizi365.fanout.queue2")
public void receive2(String msg) {
System.out.println("Nhận tin nhắn từ hàng đợi 2 = " + msg);
}
}
Vì trao đổi trước đó đã được xác định là loại fanout, mỗi tin nhắn sẽ được phân phối đến tất cả các hàng đợi được ràng buộc với sự trao đổi hiện tại, và các tin nhắn sẽ được xử lý một cách riêng biệt bởi hai phương thức phía trên.
Lưu ý: Chú thích RabbitListener có thể được áp dụng cho một lớp hoặc phương thức. Nếu chú thích RabbitListener được xác định trên một lớp, nó cần phải được kết hợp với chú thích RabbitHandler để đánh dấu phương thức lớp nào sẽ thực hiện xử lý tin nhắn.
4.3 Xác định Người Nghe Hàng Đợi với Chú Thích Đầy Đủ
Bạn không cần lớp cấu hình spring boot để xác định các sự trao đổi, hàng đợi và mối quan hệ ràng buộc. Bạn có thể trực tiếp xác định mối quan hệ ràng buộc, hàng đợi và sự trao đổi thông qua tham số bindings của chú thích RabbitListener.
@RabbitListener(
bindings = {
@QueueBinding(
value = @Queue(name = "tizi365.fanout.queue3", durable = "true"),
exchange = @Exchange(name = "tizi365.fanout", durable = "true", type = ExchangeTypes.FANOUT)
)
}
)
public void receive3(String msg) {
System.out.println("Nhận tin nhắn từ hàng đợi 3 = " + msg);
}
Giải thích:
- Chú thích QueueBinding: Xác định mối quan hệ ràng buộc giữa hàng đợi và trao đổi. Tham số giá trị được sử dụng để xác định hàng đợi, và trao đổi được sử dụng để xác định sự trao đổi.
- Chú thích Queue: Xác định một hàng đợi. Tham số tên xác định tên hàng đợi (cần phải là duy nhất), và tham số durable chỉ ra liệu có cần phải bền.
- Chú thích Exchange: Xác định sự trao đổi. Tham số tên xác định tên sự trao đổi, và tham số loại chỉ ra loại sự trao đổi.