22. tháng 1 2025
Trong RocketMQ, có một cách sử dụng khá đặc biệt gọi là tin nhắn thu tự (ordered messages). Ví dụ, trong chu kỳ sống của đơn hàng, khi tạo, thanh toán và ký nhận, sẽ phát sinh các tin nhắn tương ứng. Lúc này, việc đảm bảo thứ tự của chúng trở nên rất quan trọng. Dĩ nhiên, phần xử lý nghiệp vụ cũng có thể được thiết kế để xử lý các trường hợp này, kết hợp với cơ chế gửi lại tin nhắn. Tuy nhiên, nếu ngay từ đầu, các tin nhắn đã được đảm bảo về tính thu tự, thì mã nguồn nghiệp vụ sẽ dễ dàng tập trung hơn vào việc xử lý nghiệp vụ.
Một kịch bản phổ biến là đảm bảo toàn bộ thứ tự toàn cầu. Ví dụ, trong một topic, chỉ cho phép một luồng gửi duy nhất, với chỉ một hàng đợi bên trong và một luồng tiêu thụ duy nhất. Cách tiếp cận này dễ dàng đảm bảo tính thu tự trên toàn hệ thống, nhưng vấn đề lớn ở đây là nó hoàn toàn hạn chế hiệu năng, không thực tế cho các tình huống phức tạp hơn. Trong nhiều trường hợp thực tế, chẳng hạn như đối kèo nhà cái với cùng một đơn hàng, ta chỉ cần đảm bảo rằng trạng thái thay đổi theo đúng thứ tự mong muốn mà không yêu cầu toàn bộ hệ thống phải tuân theo thứ tự.
Đối với loại tính thu tự này, cả phía gửi và phía nhận đều cần có những xử lý tương ứng. Khi gửi tin nhắn, cần ceo nhà cái chỉ định một Selector, cụ thể là MessageQueueSelector
, để phân phối tin nhắn tới một MessageQueue
cố định bóng đá ngoại hạng anh trực tiếp hôm nay theo một phương thức nhất định. Ví dụ, trong RocketMQ:
1SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
2 @Override
3 public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
4 Long id = (Long) arg; // Hàng đợi tin nhắn được chọn dựa trên #salesOrderID
5 long index = id % mqs.size();
6 return mqs.get((int) index);
7 }
8}, orderList.get(i).getOrderId());