Bagaimana cara menghindari pengiriman SMS yang sama dua kali?

Gunakan ulang satu Idempotency-Key untuk permintaan SMS yang identik dalam tiga jam untuk menjamin permintaan diterima tepat satu kali.

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?

Tetapkan header Idempotency-Key untuk setiap pengiriman SMS yang dimaksud dan gunakan ulang header tersebut saat mencoba ulang permintaan yang identik. Jaminan penerimaan tepat satu kali berarti percobaan ulang yang cocok dalam tiga jam harus menghasilkan pengiriman diterima yang sama, meskipun Anda kehilangan responsnya.

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.

  • 409 dengan E01005 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.
  • 409 dengan E01004 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.
  • 503 dengan E01033 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 5xx lain atau timeout: coba lagi dengan backoff menggunakan key dan permintaan yang sama. Jaminan penerimaan tepat satu kali mencakup percobaan ulang ini dalam tiga jam. Berhentilah saat batas percobaan ulang Anda habis.

Header idempotency mempertahankan identitas permintaan di seluruh percobaan ulang ini.

Apakah key menjamin tidak ada duplikat?

Jaminannya adalah penerimaan tepat satu kali untuk permintaan identik dengan key yang sama di workspace yang sama dalam tiga jam. Percobaan ulang tersebut harus menghasilkan satu pengiriman yang diterima, termasuk setelah respons hilang. Periksa status pesan untuk memastikan pengiriman.

Setelah jendela retensi tiga jam, key asli dapat mengidentifikasi operasi baru. Rekonsiliasi hasil asli yang tidak diketahui sebelum mengirim lagi.

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?

  1. Tetapkan satu key untuk setiap pengiriman SMS yang dimaksud dan gunakan ulang permintaan identik untuk percobaan ulangnya.
  2. Coba lagi error jaringan, timeout, dan respons 5xx dengan backoff, dengan mempertahankan key dan permintaan yang identik dalam tiga jam.
  3. Perbaiki konflik permintaan yang berubah dan tunda percobaan ulang saat permintaan asli masih berjalan.
  4. Biarkan percobaan ulang yang habis atau kedaluwarsa tetap belum terselesaikan hingga Anda merekonsiliasi hasilnya, sebelum memutuskan apakah pengiriman lain diperlukan.

Singkatnya

  1. Satu key mengidentifikasi satu pengiriman yang dimaksud.

    Gunakan ulang key yang sama dan permintaan yang identik dalam tiga jam. Jaminan ini mencakup satu pengiriman yang diterima di seluruh percobaan ulang tersebut.

  2. 409 dapat mengidentifikasi permintaan yang berubah atau belum selesai.

    IdempotencyKeyReuse berarti permintaan berubah. RequestInProgress berarti permintaan asli masih berjalan dan perlu percobaan ulang yang ditunda.

  3. Perlindungan tidak tersedia memblokir percobaan ini.

    Respons 503 IdempotencyUnavailable berarti percobaan ini tidak dieksekusi. Respons ini tidak menetapkan hasil percobaan sebelumnya.

  4. Perlindungan penerimaan memiliki jendela retensi.

    Coba lagi dalam tiga jam. Setelah jendela itu, periksa pengiriman asli sebelum mengirim lagi.

Bangun di jaringan yang sama.

Kunci API uji coba langsung tersedia untuk Anda. Akses produksi terbuka saat Anda menambahkan metode pembayaran dan memverifikasi pengirim.

Start building with Bird in minutes.