Koneksi bisa terputus setelah Bird menerima SMS tetapi sebelum aplikasi Anda menerima responsnya. Mencoba ulang dengan key baru dapat membuat pengiriman kedua karena Bird memperlakukannya sebagai permintaan terpisah.
Bagaimana cara kerja key ini?
Anda menetapkan header Idempotency-Key untuk setiap pengiriman SMS yang dimaksud dan menggunakan ulang header tersebut saat mencoba ulang permintaan yang identik. Ketika Bird menyimpan respons asli, percobaan ulang yang cocok mengembalikan respons itu tanpa mengeksekusi pengiriman lagi.
Misalnya, konfirmasi pesanan menggunakan key yang sama saat terjadi timeout dan percobaan ulangnya. Konfirmasi untuk pesanan lain mendapat key berbeda.
Respons yang diputar ulang menyertakan Idempotency-Replay: true, sehingga log Anda dapat membedakan replay dari permintaan yang baru diproses.
Key SMS dicakupkan ke workspace Anda. Bird menyimpan respons yang selesai selama tiga jam berdasarkan kontrak idempotency-nya. Setelah jendela waktu itu, key yang sama dapat mengeksekusi permintaan baru karena catatan replay-nya telah kedaluwarsa. Percobaan ulang sehari kemudian karena itu memerlukan rekonsiliasi hasil asli sebelum pengiriman berikutnya.
Apa arti respons kegagalan ini?
Kode error membedakan permintaan yang berubah, permintaan yang belum selesai, dan perlindungan yang tidak tersedia.
409denganE01005 IdempotencyKeyReuse: key yang sama digunakan untuk permintaan berbeda. Perbaiki penetapan key sebelum mencoba ulang, karena key ini milik permintaan asli. Bird membandingkan method, endpoint, path dan query parameter, serta raw body. Bahkan perubahan spasi JSON membuat permintaan menjadi berbeda.409denganE01004 RequestInProgress: permintaan bersamaan dengan key yang sama belum selesai. Tunggu sebentar lalu coba lagi dengan key dan permintaan yang sama agar permintaan asli dapat selesai. Lock in-flight kedaluwarsa dalam 30 detik. Kedaluwarsa tidak menetapkan apakah pengiriman asli berlaku.503denganE01033 IdempotencyUnavailable: perlindungan tidak tersedia sebelum eksekusi, sehingga percobaan ini tidak dieksekusi. Coba lagi dengan backoff menggunakan key dan permintaan yang sama. Respons ini tidak menetapkan hasil percobaan sebelumnya.- Respons
5xxlain atau timeout: coba lagi dengan backoff menggunakan key dan permintaan yang sama. Bird tidak menyimpan respons5xx. Percobaan ulang memutar ulang respons sukses yang tersimpan atau dapat mengeksekusi lagi jika tidak ada respons yang tersimpan.
Header idempotency mempertahankan identitas permintaan di seluruh percobaan ulang ini.
Apakah key menjamin tidak ada duplikat?
Key mengurangi pengiriman duplikat, tetapi tidak menjamin satu kali eksekusi.
Pengiriman bisa berlaku sebelum Bird menyimpan responsnya. Jika penyimpanan respons gagal atau lock in-flight kedaluwarsa, percobaan ulang dapat mengeksekusi pengiriman lagi. Jendela retensi tiga jam juga membatasi perlindungan replay.
Simpan catatan event dan pengiriman aplikasi Anda agar Anda dapat merekonsiliasi hasil yang tidak pasti sebelum mengirim lagi. Sertakan nomor pesanan atau referensi dalam pesan agar penerima dapat mengenali event yang dimaksud.
Bagaimana jika pesan tampil dua kali di ponsel?
Idempotency key mengatur percobaan ulang API; key ini tidak mengontrol cara ponsel penerima menampilkan pesan. Tangkapan layar saja tidak menetapkan dari mana duplikat berasal.
Bandingkan log pengiriman aplikasi lengkap dengan catatan pesan Bird. Beberapa message ID yang diterima dapat membuktikan beberapa pengiriman. Menemukan hanya satu ID di log yang tidak lengkap tidak membuktikan duplikat terjadi di hilir. Sertakan ID yang relevan, tujuan, dan timestamp saat meminta dukungan untuk menyelidiki.
Apa yang harus saya lakukan?
- Tetapkan satu key untuk setiap pengiriman SMS yang dimaksud dan gunakan ulang permintaan identik untuk percobaan ulangnya.
- Coba ulang error jaringan, timeout, dan respons
5xxdengan backoff, pertahankan key untuk menjaga perlindungan replay yang tersedia. - Perbaiki konflik permintaan yang berubah dan tunda percobaan ulang saat permintaan asli masih berjalan.
- Rekonsiliasi pengiriman yang tidak pasti, termasuk yang melewati jendela replay tiga jam, sebelum memutuskan apakah pengiriman lain diperlukan.
Singkatnya
Satu key mengidentifikasi satu pengiriman yang dimaksud.
Percobaan ulang menggunakan key dan permintaan yang sama. Respons yang tersimpan diputar ulang dalam tiga jam.
409dapat mengidentifikasi permintaan yang berubah atau belum selesai.IdempotencyKeyReuse berarti permintaan berubah. RequestInProgress berarti permintaan asli masih berjalan dan perlu percobaan ulang yang ditunda.
Perlindungan tidak tersedia memblokir percobaan ini.
Respons 503 IdempotencyUnavailable berarti percobaan ini tidak dieksekusi. Respons ini tidak menetapkan hasil percobaan sebelumnya.
Replay respons mengurangi risiko duplikat tanpa menghilangkannya.
Pengiriman bisa berlaku sebelum responsnya tersimpan. Catatan replay yang kedaluwarsa juga mengizinkan eksekusi baru.