Materi
Antrean dan webhook mengirim pesan dengan jaminan setidaknya sekali (at-least-once). Azure Architecture Center menjelaskan akibatnya: penerima bisa menerima pesan yang sama lebih dari sekali, sehingga logika penerima harus idempoten, yaitu memproses pesan yang sama berkali-kali memberi hasil yang sama, tanpa catatan ganda atau tagihan berulang. Event ganda juga lahir dari coba ulang: pengirim yang kena timeout mengirim lagi, padahal kiriman pertama sudah sampai. Kelas HTTP dan API sudah membahas metode yang idempoten menurut sifatnya; di sini idempotensi dibangun dengan kunci.
AWS Builders' Library memakai pengenal permintaan unik dari pemanggil: permintaan dengan pengenal yang sama dianggap duplikat. Azure Service Bus mencatat MessageId selama jendela waktu tertentu dan membuang kiriman yang MessageId-nya sudah tercatat; dokumentasinya menyebut pengenal yang terikat proses bisnis membuat pengulangan bisa diramalkan. GitHub mempertahankan nilai header X-GitHub-Delivery yang sama saat sebuah kiriman diulang.
// Pembayaran tagihan air: kunci = nomor tagihan
const sudah = new Set();
const dicatat = [];
for (const e of [{ tagihan: "PDAM-0912" }, { tagihan: "PDAM-0913" }, { tagihan: "PDAM-0912" }]) {
if (sudah.has(e.tagihan)) continue; // kiriman ulang, lewati
dicatat.push(e.tagihan); // efeknya dulu
sudah.add(e.tagihan); // lalu kuncinya
}
// dicatat: ["PDAM-0912", "PDAM-0913"]Pilih kunci yang sama setiap kali kejadian yang sama dikirim ulang: nomor pesanan atau nomor tagihan, bukan nomor acak yang dibuat ulang di tiap percobaan. AWS menambahkan syarat penting: mencatat kunci dan menjalankan efeknya harus terjadi bersama. Kunci yang tercatat tanpa efeknya membuat percobaan ulang dibuang sebagai duplikat padahal pesanan belum tersimpan.