メインコンテンツへスキップ
見出し画像

APIを再試行したら二重登録に。送信結果が不明なときの設計演習

    送信がタイムアウトした。再送すると、二件登録されていた。返事がないことと、保存されていないことを分ける。

    通信が失敗しても、相手の処理が失敗したとは限らない。保存は終わり、その後の応答だけが失われた可能性がある。

    失敗ではなく、結果不明として扱う

    読み取り画面や状態確認APIなど、提供先が用意している方法で結果を照合する。重複すると困る更新を、結果不明のまま自動再送する設計にはしない。

    AWSの公式解説にも、副作用を重ねないための識別子と、同じ依頼の扱いがある。実サービスへ移すときは、そのAPIの仕様を確認する。

    最初に失敗時の入力・時刻・版を残す必要がある場合。 再現しない不具合で、最初に残す情報(無料)で扱っています。

    付属の実行例:同梱デモでは、新IDで再送すると保存2件、同IDなら1件。別入力でも、同じ意図を10回再送して保存1件のままであることを試しました。

    ここまでで分けたいのは、送信の返事がない状態と、相手が未保存の状態。

    二重登録になる条件を、模擬サービスで試す(300円)

    有料部分では外部通信のない模擬サービスを使う。どの再送が二重登録になるかを、実行して確認する。

    保存後に応答だけを失わせ、新IDでの再送と、同IDでの再試行を比較する。コード、テスト、実行例を付けた。

    同じIDで内容を変えた場合の拒否も見る。実際の注文システムへ、そのまま入れれば安全になるコードではない。設計上の違いを試す教材。

    実行用のPythonコード、テスト、入力例を付属する。必要なのはPCとPython。スマホでは本文や結果を読めるが、実行にはPC等を使う。

     
     
    再現する。ログを見る。別の入力で試す。実装・レビュー・設計の、動いた理由と壊れる条件を追います。コードと結果、確認できた範囲を一緒に載せます。

    あなたへのおすすめ