全部产品
Search
文档中心

ApsaraMQ for RabbitMQ:Pesan Tertunda

更新时间:Jul 02, 2025

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

Plugin pesan tertunda open source

Didukung

Didukung

Solusi pesan tertunda asli

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:

  1. Deklarasikan pertukaran bertipe x-delayed-message dan 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.

    Catatan

    Pastikan 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.

  2. 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:

  1. Produsen mengirim pesan yang dikonfigurasi dengan atribut delay ke pertukaran.

  2. Pertukaran merutekan pesan ke antrian.

  3. 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.consume dalam mode push alih-alih metode basic.get dalam mode pull untuk mengonsumsi pesan. ApsaraMQ for RabbitMQ menyimpan pesan dalam mode terdistribusi. Jika Anda menggunakan metode basic.get dalam 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.