Lewati ke konten

Idempotensi & Percobaan Ulang

Setiap panggilan realtime harus membawa Idempotency-Key. Ini bukan sekadar kesopanan rate limit — inilah yang membuat percobaan ulang aman. Jaringan bisa gagal setelah pemasok sudah dimintai; tanpa key, satu-satunya cara mengetahui apakah pemeriksaan berjalan adalah menjalankannya lagi dan membayarnya dua kali.

Kirim nilai yang dapat Anda buat ulang: UUID, ID pesanan, atau hash dari pekerjaan yang Anda lakukan. Server membatasinya pada akun Anda, sehingga dua pengguna tidak bisa bertabrakan.

Key samaPayloadHasil
Key baruapa punBerjalan normal, ditagih
Key samaidentikRespons yang tersimpan dikembalikan; replayed=true. Tidak ada tagihan baru.
Key samaberbeda409 idempotency_conflict — sebuah key terikat pada payload yang pertama kali dibawanya
Key samaidentik, panggilan pertama masih berjalan409 request_in_progress dengan Retry-After

Idempotency-Key dibatasi 191 byte dan catatan replay disimpan selama 30 hari secara default.

Keduanya terlihat mirip dalam respons tetapi artinya berbeda:

FieldDi manaArtinya
replayedtingkat atasPanggilan ini tidak pernah sampai ke pemasok — Anda melakukan replay atas sebuah key.
cacheddi dalam tiap hasilPutusan produk ini disajikan dari cache hasil.

Panggilan replay mereproduksi respons asli, termasuk nilai cached tiap entri. Tidak ada flag yang mengubah tagihan Anda: replay tidak pernah memindahkan uang, dan hit cache tetap ditagih dengan harga per pemeriksaan produk.

Hanya hasil yang sudah diselesaikan yang disimpan sebagai fakta. Hasil gagal dan unknown tidak di-cache — pemeriksaan berikutnya atas pengenal yang sama terhadap produk yang sama akan menanyai pemasok lagi, bukan melakukan replay atas jawaban yang tidak konklusif.

Yang Anda lihatYang harus dilakukan
Timeout, atau HTTP 500Kirim ulang body asli dengan key asli. Hasilnya tidak pasti; inilah kasus yang menjadi alasan key ini ada.
409 request_in_progressTunggu Retry-After, lalu kirim ulang body yang sama dengan key yang sama.
409 idempotency_conflictKey tersebut sudah membawa payload yang berbeda. Buat key baru — jangan mengubah body lalu memakai ulang key lama.
429 realtime_rate_limitedTunggu Retry-After. Tidak ada yang dikirim, jadi key yang sama masih belum terpakai dan aman untuk dikirim.
503 realtime_route_unavailableTidak ada yang dikirim. Coba lagi nanti, key yang sama.

Satu hal yang tidak boleh dilakukan setelah timeout adalah mengirim key baru untuk pekerjaan yang sama: jika panggilan pertama ternyata berhasil, Anda baru saja membayar pemeriksaan itu dua kali.

HTTPcode
400idempotency_key_required — header tidak ada
409request_in_progress — panggilan asli masih berjalan
409idempotency_conflict — key pertama kali dipakai dengan payload yang berbeda