Kunci Idempotensi, Secara Praktis
Catatan kerja tentang membuat endpoint tulis aman untuk di-retry tanpa menambah transaksi terdistribusi.
Terakhir dirawat
Retry bukanlah kasus tepi — itu perilaku default setiap jaringan. Pertanyaannya bukan apakah sebuah request tiba dua kali, melainkan kapan.
Kontrak minimum yang layak
Klien membuat sebuah kunci (UUID sudah cukup) dan mengirimnya bersama request tulis:
POST /payments
Idempotency-Key: 5f9c...e21
Server menyimpan kunci itu sebelum mengerjakan tugas, dibatasi per endpoint dan per pemanggil. Tiga kemungkinan:
- Kunci baru → proses, simpan respons terhadap kunci, kembalikan.
- Kunci sedang berjalan → kembalikan
409dan biarkan klien menunggu. - Kunci selesai → putar ulang respons tersimpan apa adanya. Tanpa eksekusi ulang.
Yang sering keliru
- Mem-hash isi request alih-alih memakai kunci dari klien — kini “request sama, niat baru” yang sah malah tertelan diam-diam.
- Menyimpan kunci setelah efek samping terjadi, menyisakan celah saat crash.
- Lupa TTL, sehingga tabel kunci tumbuh selamanya.
Idempotensi adalah properti yang Anda rancang ke dalam operasi tulis, bukan middleware yang ditambahkan belakangan.