Jika Anda ingin pesan dikonsumsi dalam periode waktu tertentu, Anda dapat menggunakan fitur pesan tertunda yang disediakan oleh ApsaraMQ for RabbitMQ. ApsaraMQ for RabbitMQ secara native mendukung fitur ini dan menawarkan implementasi yang lebih mudah digunakan dibandingkan dengan RabbitMQ open source.
Apa itu pesan tertunda?
Pesan tertunda adalah pesan yang dikonsumsi dalam periode waktu tertentu setelah dikirim oleh produsen.
Skenario umum
Pesan tertunda dapat digunakan dalam skenario berikut:
Diperlukan jendela waktu antara produksi dan konsumsi pesan. Sebagai contoh, ketika pesanan dibuat di platform e-commerce, produsen mengirim pesan tertunda ke broker ApsaraMQ for RabbitMQ. Pesan tersebut digunakan untuk memastikan apakah pesanan telah dibayar dalam periode waktu tertentu. Broker ApsaraMQ for RabbitMQ mengirimkan pesan kepada konsumen 30 menit setelah menerima pesan tersebut. Setelah konsumen menerima pesan, konsumen memeriksa apakah pembayaran telah selesai. Jika pembayaran belum selesai, pesanan akan ditutup. Jika tidak, konsumen mengabaikan pesan tersebut.
Pesan digunakan untuk memicu tugas terjadwal. Sebagai contoh, Anda dapat menggunakan pesan tertunda untuk memicu tugas terjadwal yang mengirim notifikasi kepada pengguna.
Aturan untuk menentukan periode penundaan
Nilai periode penundaan untuk sebuah pesan harus berupa bilangan bulat non-negatif. Unit: milidetik.
Jika periode penundaan yang Anda tentukan untuk pesan tertunda lebih lama daripada periode penundaan maksimum yang diizinkan untuk pesan tersebut, pesan tersebut akan diproses sebagai pesan normal dan langsung dikirimkan ke konsumen. Periode penundaan maksimum bervariasi berdasarkan jenis instance. Untuk informasi lebih lanjut, lihat Kluster.
Jika Anda telah menentukan time-to-live (TTL) untuk pesan tertunda, TTL pesan aktual dihitung dengan menggunakan rumus berikut:
TTL pesan aktual = min {TTL tingkat pesan atau TTL tingkat antrian} + Periode penundaan. Untuk informasi lebih lanjut, lihat TTL Pesan.
Perbandingan antara solusi pesan tertunda
Anda dapat menggunakan ApsaraMQ for RabbitMQ untuk mengimplementasikan semua solusi pesan tertunda yang disediakan oleh RabbitMQ open source tanpa perlu memodifikasi kode. Tabel berikut membandingkan solusi pesan tertunda dari ApsaraMQ for RabbitMQ dan RabbitMQ open source.
Solusi | RabbitMQ Open Source | ApsaraMQ for RabbitMQ |
Pertukaran surat mati + TTL tingkat antrian | Didukung | Didukung |
Pertukaran surat mati + TTL tingkat pesan | Didukung | Didukung |
Didukung | Didukung | |
Tidak didukung | Didukung |
Plugin pesan tertunda open source
Untuk menyelaraskan dengan RabbitMQ open source, ApsaraMQ for RabbitMQ kompatibel dengan plugin pesan tertunda open source. Anda dapat menggunakan plugin ini untuk mengirim dan menerima pesan tertunda tanpa perlu menginstal plugin tersebut. Untuk menggunakan plugin pesan tertunda open source, lakukan operasi berikut:
Deklarasikan pertukaran bertipe
x-delayed-messagedan konfigurasikan argumen ekstensi x-delayed-type dari pertukaran untuk menentukan aturan routing. Contoh kode:Map<String, Object> args = new HashMap<String, Object>(); args.put("x-delayed-type", "direct"); channel.exchangeDeclare("ExchangeName", "x-delayed-message", true, false, args);Tabel berikut menjelaskan parameter dalam kode sebelumnya.
Parameter
Deskripsi
x-delayed-type
Tipe pertukaran. Parameter ini digunakan untuk menentukan aturan routing. Nilai valid:
direct
fanout
topic
headers
x-jms-topic
ExchangeName
Nama pertukaran.
CatatanPastikan bahwa pertukaran yang dideklarasikan dibuat di konsol ApsaraMQ for RabbitMQ. Untuk informasi lebih lanjut, lihat Buat pertukaran.
x-delayed-message
Tipe pertukaran yang digunakan untuk merutekan pesan tertunda.
Kirim pesan tertunda. Tambahkan pasangan nilai-kunci ke atribut headers dari pesan dan tentukan bahwa pesan dikirim ke pertukaran yang dideklarasikan pada langkah sebelumnya. Kunci dari pasangan nilai-kunci adalah x-delay dan nilainya adalah jumlah milidetik. Contoh kode:
byte[] messageBodyBytes = "payload tertunda".getBytes("UTF-8"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("x-delay", 5000);// Menentukan bahwa periode penundaan untuk pesan adalah 5.000 milidetik. AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder().headers(headers); channel.basicPublish("ExchangeName", "", props.build(), messageBodyBytes);
Solusi pesan tertunda asli
ApsaraMQ for RabbitMQ memungkinkan Anda mengonfigurasi atribut delay untuk pesan guna menundanya. Bagian berikut menjelaskan proses penerusan data pesan tertunda asli di ApsaraMQ for RabbitMQ:
Produsen mengirim pesan yang dikonfigurasi dengan atribut delay ke pertukaran.
Pertukaran merutekan pesan ke antrian.
Konsumen hanya dapat mengonsumsi pesan dari antrian setelah periode waktu yang ditentukan oleh atribut delay berakhir.

Praktik terbaik solusi pesan tertunda asli
Klien Produsen
Solusi pesan tertunda asli dari ApsaraMQ for RabbitMQ mudah digunakan. Anda hanya perlu mengonfigurasi atribut delay untuk pesan yang dikirim dari klien produsen.
Contoh kode berikut memberikan contoh cara mengirim pesan tertunda dalam Java:
Map<String, Object> headers = new HashMap<>(); headers.put("delay", "5000");// Menentukan bahwa periode penundaan untuk pesan adalah 5.000 milidetik. AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().messageId(UUID.randomUUID().toString()).headers(headers).build();Untuk informasi tentang contoh kode dalam bahasa pemrograman lainnya, lihat AMQP Demos.
Klien Konsumen
Untuk memastikan bahwa pesan tertunda dapat segera dikirimkan ke konsumen setelah periode penundaan yang ditentukan tercapai, kami sarankan Anda menggunakan metode
basic.consumedalam mode push alih-alih metodebasic.getdalam mode pull untuk mengonsumsi pesan. ApsaraMQ for RabbitMQ menyimpan pesan dalam mode terdistribusi. Jika Anda menggunakan metodebasic.getdalam mode pull untuk mendapatkan pesan, Anda mungkin tidak mencapai node tempat pesan disimpan.
FAQ
Mengapa periode penundaan aktual lebih lama daripada nilai penundaan yang ditentukan?
Klien konsumen menggunakan metode basic.get dalam mode pull untuk mengonsumsi pesan. Pesan dalam ApsaraMQ for RabbitMQ disimpan dalam kluster. Ketika pesan dirutekan ke broker ApsaraMQ for RabbitMQ menggunakan metode basic.get dalam mode pull, konsumen mungkin tidak segera menarik pesan dari broker lain setelah periode penundaan yang ditentukan tercapai.