全部产品
Search
文档中心

Simple Message Queue (formerly MNS):Konsumsi Idempotensi

更新时间:Jun 29, 2025

Untuk mencegah pengecualian bisnis akibat konsumsi pesan berulang, Simple Message Queue (SMQ, sebelumnya MNS) menyediakan fitur konsumsi idempotensi. Fitur ini memungkinkan konsumen melakukan pemrosesan idempoten pada pesan berdasarkan pengenal bisnis unik setelah menerima pesan. Topik ini menjelaskan konsep, skenario, dan metode pemrosesan idempotensi pesan.

Apa itu idempotensi pesan?

Dalam antrian pesan, pesan dapat dikirimkan berulang kali ke konsumen karena pengecualian jaringan atau kegagalan sistem. Dalam situasi seperti ini, Anda dapat melakukan pemrosesan idempoten pada pesan untuk memastikan logika bisnis hanya dieksekusi sekali. Hal ini membantu meminimalkan kesalahan data atau ketidaksesuaian hasil yang disebabkan oleh konsumsi pesan berulang.

Sebagai contoh, konsumen mengurangi pembayaran pesanan berdasarkan pesan pengurangan pembayaran. Jumlah pembayaran adalah USD 100. Pesan tersebut dikirimkan berulang kali kepada konsumen karena pengecualian jaringan atau kegagalan sistem. Akibatnya, pesan tersebut dikonsumsi beberapa kali. Namun, pembayaran hanya dikurangi sekali, dengan satu catatan pengurangan sebesar USD 100 untuk pesanan tersebut. Dalam contoh ini, idempotensi pesan diimplementasikan dalam proses konsumsi pesan, sehingga pengurangan pembayaran memenuhi persyaratan bisnis.

Skenario

Ketika sebuah sistem mengalami guncangan jaringan, kegagalan sistem, pesan berulang, atau anomali lainnya, terutama dalam sistem terdistribusi, pesan dapat dikonsumsi berulang kali. Dalam hal ini, idempotensi pesan dapat digunakan untuk meningkatkan keandalan dan konsistensi sistem. Berikut adalah alasan umum yang menyebabkan konsumsi berulang dari pesan yang sama:

  • Durasi konsumsi pesan melebihi durasi tak terlihat: Ketika konsumen A membutuhkan waktu lebih lama untuk memproses pesan daripada nilai parameter InvisibleDuration untuk pesan tersebut, pesan akan dikirim ulang ke konsumen B, sehingga menyebabkan kedua konsumen A dan B memproses pesan yang sama.

  • Pengecualian jaringan atau guncangan: Setelah pesan berhasil diproses oleh konsumen, jaringan terputus. Dalam kasus ini, permintaanDeleteMessage tidak direspons, dan pesan akan dikirim ulang ke konsumen setelah jaringan pulih.

  • Broker atau konsumen layanan restart: Setelah pesan berhasil diproses oleh konsumen, sistem mungkin gagal merespons permintaanDeleteMessage jika broker atau konsumen layanan direstart. Dalam kasus ini, pesan mungkin dikirim ulang ke konsumen setelah durasi tak terlihat.

Metode pemrosesan

Dalam antrian pesan, ID pesan biasanya digunakan sebagai kunci idempoten untuk melakukan pemrosesan idempoten pada pesan. Namun, pesan dengan ID pesan yang berbeda mungkin berisi konten yang sama. Untuk menghindari konflik atau pengulangan, hindari melakukan pemrosesan idempoten pada pesan berdasarkan ID pesan. Kami menyarankan Anda menetapkan pengenal unik sebagai kunci idempoten yang secara spesifik mengidentifikasi bisnis Anda.

  • Pengenal unik: Tetapkan pengenal unik untuk setiap pesan. Saat pesan dikirimkan ke konsumen, pengenal unik dari pesan tersebut dicatat. Ini memastikan bahwa pesan tidak akan dikonsumsi lagi oleh konsumen ini.

  • Kendala basis data: Tetapkan kendala unik dalam basis data. Anda tidak dapat menyisipkan data yang telah disimpan karena pelanggaran kendala, sehingga mencapai idempotensi.

  • Pemeriksaan berkala status bisnis: Konsumen harus memeriksa status saat ini dari pesan sebelum mengonsumsinya. Sebagai contoh, konsumen perlu memeriksa apakah pesan sudah ada atau telah diproses. Jika ya, pesan langsung dikembalikan tanpa menjalankan operasi selanjutnya.

  • Operasi penggabungan: Untuk mencapai idempotensi, Anda dapat menggabungkan beberapa pesan untuk operasi tertentu. Dengan cara ini, hasil konsumsi akhir sama dengan hasil konsumsi awal.