全部产品
Search
文档中心

ApsaraMQ for RocketMQ:Idempotensi Pesan

更新时间:Jun 28, 2025

Dalam ApsaraMQ for RocketMQ, setelah konsumen menerima pesan, ia harus memprosesnya secara idempoten berdasarkan kunci pesan yang secara unik mengidentifikasi bisnis tertentu. Hal ini mencegah terjadinya pengecualian pemrosesan bisnis akibat konsumsi pesan berulang. Topik ini menjelaskan konsep idempotensi pesan, skenario penggunaannya, serta cara mengimplementasikannya.

Apa itu idempotensi pesan?

Ketika konsumen mengonsumsi pesan secara berulang, hasil dari konsumsi berulang tersebut sama dengan hasil dari satu kali konsumsi, dan konsumsi berulang tidak memengaruhi sistem bisnis secara negatif. Dalam hal ini, idempotensi pesan dianggap telah diimplementasikan.

Sebagai contoh, konsumen mengurangi pembayaran pesanan berdasarkan pesan pengurangan pembayaran. Jumlah pembayaran adalah USD 100. Pesan tersebut dikirimkan berulang kali ke konsumen karena masalah jaringan seperti koneksi yang tidak stabil. Akibatnya, pesan tersebut dikonsumsi berulang kali. Namun, pembayaran hanya dikurangi sekali, dan hanya satu catatan pengurangan sebesar USD 100 yang dihasilkan untuk pesanan tersebut. Dalam contoh ini, idempotensi pesan diimplementasikan dalam proses konsumsi pesan, dan pengurangan pembayaran memenuhi persyaratan bisnis.

Skenario

Dalam aplikasi Internet, terutama dalam kasus koneksi jaringan yang tidak stabil, pesan ApsaraMQ for RocketMQ mungkin dikonsumsi berulang kali. Jika konsumsi pesan berulang memengaruhi bisnis Anda, Anda dapat mengimplementasikan pemrosesan idempoten pada pesan tersebut.

Pesan dapat dikonsumsi berulang kali dalam skenario berikut:

  • Produsen mengirimkan pesan berulang kali ke broker Antrian Pesan untuk RocketMQ.

    Jika terjadi koneksi jaringan sementara atau produsen mengalami kerusakan setelah pesan dikirimkan ke dan disimpan dalam broker ApsaraMQ for RocketMQ, broker gagal merespons produsen. Dalam hal ini, produsen menentukan bahwa broker tidak menerima pesan dan mengirimkan pesan lagi. Akibatnya, konsumen menerima dua pesan yang memiliki konten sama tetapi ID pesan berbeda.

  • Broker ApsaraMQ for RocketMQ mengirimkan pesan berulang kali ke konsumen.

    Pesan dikirimkan ke konsumen dan diproses oleh konsumen. Ketika konsumen mengirimkan respons ke broker ApsaraMQ for RocketMQ, terjadi koneksi jaringan sementara. Dalam hal ini, broker ApsaraMQ for RocketMQ tidak mengetahui apakah pesan tersebut telah dikonsumsi. Untuk memastikan bahwa pesan dikonsumsi setidaknya sekali, broker mengirimkan pesan lagi setelah jaringan pulih. Akibatnya, konsumen menerima dua pesan yang memiliki konten sama dan ID pesan sama.

  • Pesan dikirimkan berulang kali ke konsumen karena penyeimbangan beban. Faktor-faktor yang memicu penyeimbangan beban mencakup tetapi tidak terbatas pada jitter jaringan, restart broker, dan restart aplikasi konsumen.

    Penyeimbangan beban dipicu jika Anda me-restart atau menskalakan broker ApsaraMQ for RocketMQ atau klien. Selama penyeimbangan beban, konsumen mungkin menerima pesan berulang.

Mengimplementasikan idempotensi pesan

Pesan dengan ID pesan berbeda mungkin berisi konten pesan yang sama. Kami menyarankan agar Anda tidak mengimplementasikan pemrosesan idempoten berdasarkan ID pesan untuk menghindari konflik. Sebagai gantinya, gunakan pengenal bisnis unik untuk mengimplementasikan pemrosesan idempoten. Anda dapat menggunakan kunci pesan untuk menentukan pengenal bisnis.

Sebagai contoh, dalam skenario pembayaran, Anda dapat menentukan ID pesanan sebagai kunci pesan dan mengimplementasikan pemrosesan idempoten berdasarkan kunci pesan yang ditentukan. Contoh kode berikut memberikan contoh tentang cara menentukan kunci spesifik bisnis unik untuk pesan:

Message message = new Message();
message.setKey("ORDERID_100");
SendResult sendResult = producer.send(message);           

Ketika konsumen menerima pesan, konsumen dapat melakukan pemrosesan idempoten berdasarkan kunci pesan.

consumer.subscribe("ons_test", "*", new MessageListener() {
    public Action consume(Message message, ConsumeContext context) {
        String key = message.getKey()
        // Lakukan pemrosesan idempoten berdasarkan kunci pesan yang secara unik mengidentifikasi bisnis Anda.
    }
});