業務システムが外部サービスと連携すると、必ず起きるのが「二重に処理された」「届いていない」「順番が入れ替わった」といった問題です。
これは、運用の頑張りだけでは解消できません。システム側に再試行と冪等性(同じイベントを複数回受けても結果が同じになる性質)を組み込む必要があります。
本記事では、Webhook/API連携で処理を安定させるための設計を、実務の観点で整理します。
Webhook/API連携の管理画面イメージ
外部連携では、次の理由で同じイベントが複数回届きます。
つまり、二重送信を完全にゼロにするより、同じイベントが複数回来ても結果が変わらない設計にしておく方が現実的です。
冪等性は、受信イベントに付与される一意ID(イベントID)だけでなく、業務側のキーでも守ると強くなります。
例として、次のようなキーを組み合わせて「処理済み」を持ちます。
問い合わせや予約のようにステータス遷移が多い場合は、ステータス運用と整合する形で「同じ遷移を二回受けても同じ状態になる」ように作るのが基本です。
再試行は、回数や間隔を決めずに続けると、外部側にも自社側にも負荷がかかります。
そのため、次のように段階を分けて設計します。
打ち切った後に必要なのは、「どこまで進んで、何が失敗したか」が分かるログです。ここは 監査ログ設計 と同様、追記・理由・エラー内容を残すと復旧が早くなります。
再試行が尽きたら、現場が確認できる形に切り替える必要があります。最低限、次の情報を用意しておくと対応しやすくなります。
この「失敗一覧」は、問い合わせ管理の保存ビュー(フィルタ設計)と同じ発想で作ると、運用担当にも説明しやすくなります。
外部連携で問い合わせや予約が自動登録されると、担当割当も自動化されがちです。
ただし、担当割当には例外が多いため、自動・手動・混在の割当 を前提にし、連携登録時点では「仮割当」にしておく設計も現実的です。
予約枠や受付枠は、二重計上がそのまま現場の混乱につながります。業務の流れは 物流向け を前提に、冪等キーを「予約番号+日時+バース」など業務キー寄りで強化すると、重複登録を抑えやすくなります。
連携で予約や入庫が自動登録されると、二重登録が当日の段取りに影響します。業務の流れは 自動車販売・整備・タイヤショップ向け を前提に、冪等性と再試行を初期要件として含めておく方が安全です。
外部連携は、二重処理と取りこぼしが起きる前提で設計すると安定します。
冪等キーで処理済み管理を持ち、再試行は段階化し、最後は手作業に移せる画面とルールを用意する。ログは追記で説明できる形にする。
これを最初から組み込んでおくことで、運用開始後の「なぜ二重になったのか」「どこで止まったのか」という確認にかかる時間を減らせます。インテンスでも、連携がある案件では、この設計を早い段階から要件に入れることを重視しています。