RabbitMQ tidak secara alami mendukung pesan yang terlambat. Saat ini, implementasi utama termasuk menggunakan skema pertukaran pesan mati + TTL pesan atau plugin rabbitmq-delayed-message-exchange.

Kasus penggunaan untuk antrian terlambat

  • Skenario di mana ada persyaratan jendela waktu untuk produksi dan konsumsi pesan. Contohnya, dalam transaksi e-commerce, ada skenario di mana pesanan ditutup jika pembayaran tidak diselesaikan dalam jangka waktu tertentu. Dalam hal ini, pesan terlambat dikirim saat pesanan dibuat. Pesan ini akan disampaikan ke konsumen 30 menit kemudian, dan konsumen perlu memeriksa apakah pesanan yang sesuai sudah dibayar. Jika pembayaran belum diselesaikan, pesanan ditutup; jika pembayaran sudah diselesaikan, pesan diabaikan.
  • Skenario di mana tugas terlambat dipicu oleh pesan. Contohnya, mengirim pesan pengingat kepada pengguna setelah jangka waktu tertentu.

Skema pertukaran pesan mati + TTL pesan

Ide inti dari pendekatan ini adalah membuat antrian tanpa konsumen dan memanfaatkan waktu kedaluwarsa pesan (TTL). Ketika sebuah pesan kedaluwarsa, pesan tersebut menjadi pesan mati, yang dirute ke pertukaran pesan mati, dan kemudian ke antrian pesan mati, yang dapat dikonsumsi.

Dalam pendekatan ini, waktu kadaluarsa pesan berfungsi sebagai waktu tunda pesan. Misalnya, jika TTL pesan diatur menjadi 30 detik dan tidak ada konsumen untuk antrian, pesan akan kedaluwarsa setelah 30 detik dan menjadi pesan mati, yang akan ditangani oleh antrian pesan mati.

Untuk menerapkan pendekatan ini, properti perlu diatur seperti yang dijelaskan dalam dua tutorial berikut:

Solusi plugin pesan terlambat

1. Menginstal plugin

Repositori GitHub rabbitmq-delayed-message-exchange:

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

Unduh file rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez dari bagian asset halaman rilis di GitHub dan letakkan file tersebut di direktori plugin RabbitMQ (direktori plugin).

Catatan: Nomor versi mungkin berbeda dari yang ada dalam tutorial ini. Jika RabbitMQ Anda adalah versi terbaru, cukup pilih versi terbaru dari plugin.

2. Mengaktifkan plugin

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

3. Mendefinisikan pertukaran

Atur properti pertukaran kustom menggunakan x-delayed-type untuk mendukung pengiriman pesan terlambat.

props := make(map[string]interface{})
// Parameter kunci untuk mendukung pengiriman pesan terlambat
props["x-delayed-type"] = "direct"

// Deklarasikan pertukaran
err = ch.ExchangeDeclare(
"delay.queue", // Nama pertukaran
"fanout",      // Tipe pertukaran
true,          // Tahan lama
false,
false,
false,
props,         // Atur properti
)

4. Mengirim pesan terlambat

Atur waktu tunda pesan menggunakan header pesan (x-delay).

msgHeaders := make(map[string]interface{})
//Atur waktu tunda pesan menggunakan header pesan, dalam milidetik
msgHeaders["x-delay"] = 6000

err = ch.Publish(
"delay.queue", // Nama pertukaran
"",            // Parameter routing
false,
false,
amqp.Publishing{
Headers: msgHeaders,   // Atur header pesan
ContentType: "text/plain",
Body: []byte(body),
})

Catatan: Jika Anda menggunakan layanan RabbitMQ Message Queue dari Alibaba Cloud secara langsung, Anda dapat mengatur waktu tunda menggunakan atribut header pesan (delay) tanpa menginstal plugin. Alibaba Cloud telah memperluas RabbitMQ untuk tujuan ini.