RabbitMQ không hỗ trợ tin nhắn trì hoãn một cách tự nhiên. Hiện tại, các cách thực hiện chính bao gồm việc sử dụng một sơ đồ sổ đen trao đổi (dead-letter exchange) kết hợp với cơ chế thời gian sống của tin nhắn (message TTL) hoặc sử dụng plugin rabbitmq-delayed-message-exchange.

Các trường hợp sử dụng cho hàng đợi trì hoãn

  • Các trường hợp khi yêu cầu cửa sổ thời gian cho việc sản xuất và tiêu thụ tin nhắn. Ví dụ, trong giao dịch thương mại điện tử, có một tình huống khi đơn hàng sẽ bị đóng nếu thanh toán không hoàn tất trong một khoảng thời gian chờ đợi. Trong trường hợp này, một tin nhắn trì hoãn được gửi khi đơn hàng được tạo. Tin nhắn này sẽ được gửi đến người tiêu dùng sau 30 phút, và người tiêu dùng cần kiểm tra xem đơn hàng tương ứng đã được thanh toán chưa. Nếu thanh toán chưa hoàn tất, đơn hàng sẽ bị đóng; nếu thanh toán được hoàn tất, tin nhắn sẽ bị bỏ qua.
  • Các trường hợp khi nhiệm vụ trì hoãn được kích hoạt bằng tin nhắn. Ví dụ, gửi tin nhắn nhắc nhở đến người dùng sau một khoảng thời gian cụ thể.

Cơ chế sổ đen trao đổi (dead-letter exchange) kết hợp với cơ chế thời gian sống của tin nhắn (message TTL)

Ý tưởng cốt lõi của phương pháp này là tạo ra một hàng đợi mà không có người tiêu dùng và tận dụng thời gian hết hạn của tin nhắn (TTL). Khi một tin nhắn hết hạn, nó trở thành một sổ đen (dead letter), được định tuyến đến một sổ đen trao đổi (dead-letter exchange), và sau đó đến một hàng đợi sổ đen (dead-letter queue), mà có thể được tiêu thụ.

Trong phương pháp này, thời gian hết hạn của tin nhắn phục vụ như thời gian trì hoãn của tin nhắn. Ví dụ, nếu thời gian TTL của tin nhắn được thiết lập là 30 giây và không có người tiêu dùng cho hàng đợi, tin nhắn sẽ hết hạn sau 30 giây và trở thành một sổ đen, sẽ được xử lý bởi hàng đợi sổ đen.

Để triển khai phương pháp này, các thuộc tính cần được thiết lập như mô tả trong hai hướng dẫn sau:

Giải pháp plugin tin nhắn trì hoãn

1. Cài đặt plugin

Kho lưu trữ GitHub của rabbitmq-delayed-message-exchange:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

Tải tệp rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez từ phần tài nguyên trên trang phát hành trên GitHub và đặt tệp vào thư mục plugin của RabbitMQ (thư mục plugins).

Lưu ý: Số phiên bản có thể khác nhau so với phiên bản trong bài hướng dẫn này. Nếu RabbitMQ của bạn là phiên bản mới nhất, đơn giản chỉ cần chọn phiên bản mới nhất của plugin.

2. Kích hoạt plugin

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

3. Xác định sự trao đổi

Thiết lập các thuộc tính sổ trao đổi tùy chỉnh bằng cách sử dụng x-delayed-type để hỗ trợ gửi tin nhắn trì hoãn.

props := make(map[string]interface{})
// Tham số Key để hỗ trợ gửi tin nhắn trì hoãn
props["x-delayed-type"] = "direct"

// Khai báo sự trao đổi
err = ch.ExchangeDeclare(
"delay.queue", // Tên trao đổi
"fanout",      // Loại trao đổi
true,          // Bền vững
false,
false,
false,
props,         // Thiết lập các thuộc tính
)

4. Gửi tin nhắn trì hoãn

Thiết lập thời gian trì hoãn tin nhắn bằng cách sử dụng tiêu đề tin nhắn (x-delay).

msgHeaders := make(map[string]interface{})
// Thiết lập thời gian trì hoãn tin nhắn bằng cách sử dụng tiêu đề tin nhắn, tính bằng mili giây
msgHeaders["x-delay"] = 6000

err = ch.Publish(
"delay.queue", // Tên trao đổi
"",            // Tham số định tuyến
false,
false,
amqp.Publishing{
Headers: msgHeaders,   // Thiết lập tiêu đề tin nhắn
ContentType: "text/plain",
Body: []byte(body),
})

Lưu ý: Nếu bạn đang sử dụng dịch vụ Hàng đợi Tin nhắn RabbitMQ của Alibaba Cloud trực tiếp, bạn có thể thiết lập thời gian trì hoãn bằng cách sử dụng thuộc tính tiêu đề tin nhắn (delay) mà không cần cài đặt plugin. Alibaba Cloud đã mở rộng RabbitMQ cho mục đích này.