Unit 07-05(STAGE 07 の 5 / 8)

同じ処理が2回来ても大丈夫にする

学習状況:未着手

このユニットの結論

システムどうしの連携では、同じデータが2回届くことは「起きてはいけないこと」ではなく、「いつか必ず起きること」として設計します。

同じ処理を2回受け取っても、結果が1回分と同じになるようにしておく(この性質を「冪等性(べきとうせい)」と呼びます)ことで、送り直し(再送)を安全に行えるようになります。

1. 何の話か

このユニットは、連携の二重処理を防ぐ設計の話です。

07-04 相手システムが止まっていたらどうするか では、相手が止まっていたときに、送り直すと二重処理になるおそれがあることを学びました。このユニットでは、二重に届いても困らない仕組みを、どう作るかを考えます。

2. なぜ必要か

二重に届くことを考えずに作ると、

ということが起きます。

3. このユニットで分かること

4. 同じ処理が2回届く理由

一般的に、次のようなときに起きます。

このうちいくつかは、どんなに注意しても完全には防げません。そのため、受け取る側で、2回来ても困らないようにすることが大切です。

5. 二重に届いても大丈夫にする方法

方法 考え方 例(教材上の例)
一意の番号を付ける 送るデータごとに重ならない番号を付け、受け取る側で「すでに処理した番号か」を確かめる 工数の連携で、1件ごとに送り元の番号を付け、同じ番号は2回目を処理しない
「足す」ではなく「置き換える」 「10を足す」ではなく「合計を10にする」のように、何回処理しても結果が同じになる形で送る 数量の変化ではなく、最新の数量を送る
処理済みの記録を残す どこまで処理したかを記録し、送り直しはその続きから行う 処理した最後の番号を記録する

「置き換える」方法では、古い送り直しが新しいデータの後に届くと、新しい値を古い値で上書きしてしまいます。送った順番や、データの更新の時刻・番号も確かめるようにします。

どの方法を使うかは、連携ごとに、データの性質と、相手のシステムの作りに合わせて決めます。連携の一覧(ARC-004)に、連携ごとの方法を書いておきます。

CASE FACTFROZEN正本に記載されたアステリア案件の事実

アステリア案件に関係する記載

  • 約36本のシステム連携。正本で経路が定義されているのは IF-01〜IF-12
  • SYS-06 システム連携基盤。IF-04 工数連携:勤怠・工数SaaS → 連携基盤 → 新基幹
  • Vendor B / クラウドブリッジの担当範囲に連携が含まれる

アステリア案件の各連携が、二重処理をどう防ぐかは、正本に記載がありません。未確定 上の工数の例は教材上の例で、IF-04 の設計ではありません。

6. THINK — 「うちは送る側で気をつけるから大丈夫」

(教材上の例)連携の設計の打ち合わせで、送る側のシステムの担当者が次のように言いました。

「送る側で、同じデータを2回送らないようにしっかり作ります。だから、受け取る側で二重を確かめる仕組みは要りません。」

問題

この考えで、受け取る側の仕組みを省いてよいでしょうか。

判断例を開く

判断

省くべきではありません。

確認すること:

  • 応答が返ってこなかったとき、送る側は「送れたか」を確実に知ることができるか
  • 障害のあと、送り直しの範囲を、送る側だけで正しく決められるか
  • 間に連携の仕組みがある場合、その仕組みが同じものを2回届けることはないか
  • 担当者が手で処理をやり直すことはないか

送る側の注意は大切ですが、それだけでは防ぎきれない場面があります。受け取る側でも、2回来たときに困らないようにしておきます。

7. 設計とテストで確かめること

8. よくある失敗

9. 成果物との接続

10. AI WORKFLOW — 二重処理のおそれを洗い出させる

AIは、連携の一覧から、二重処理のおそれがある箇所を探す下書きに役立ちます。

指示例:

「次の連携の一覧について、連携ごとに、①同じデータが2回届く可能性がある場面、②2回処理されたときに困ること、③決められている二重処理の防ぎ方(記載がなければ『記載なし』)、を表にしてください。防ぎ方を決めないでください。」

11. REVIEW — AIの洗い出しを確認する

  • 表が、連携の一覧の元の内容と合っているか
  • AIが、防ぎ方を推測で書いていないか
  • 「記載なし」の連携について、担当に確かめたか

ADVANCED深掘り — 実務者向けに一段深く

深掘り — 冪等キーと、重複判定の保持期間

1 回の業務処理に 1 つの番号

送り手は、1 回の業務処理(たとえば 1 件の請求の確定)に、二度と重ならない番号を付けて送ります。受け手は、同じ番号を 2 回受け取ったら、処理せずに「済み」の結果を返します。この番号を冪等キーと呼びます。番号は通信の単位ではなく、業務の単位で付けます。通信の単位で付けると、再送のたびに新しい番号になり、意味がなくなります。

「済み」をどれだけ覚えておくか

受け手は「この番号は処理した」という記録を保持します。保持が短いと、古い再送を新しい処理として二重に行います。長いと記録が増え続けます。保持期間は、再送が起こりうる最大の遅れ(夜間処理のやり直し、相手の復旧までの時間)から決めます。

配信の保証の現実

世界で共有されている考え方では、「少なくとも 1 回は届く」設計が普通で、「ちょうど 1 回だけ届く」ことを通信だけで保証するのは難しいとされています。だから「ちょうど 1 回だけ処理する」は、受け手の冪等性で実現します。

記録と処理の順序

「処理してから済みの記録を残す」と、処理の直後に止まったとき、記録がなく二重処理になります。「記録を残してから処理する」と、処理の前に止まったとき、記録はあるのに処理されていない状態になります。どちらが安全かは業務によります。途中で止まったときの状態を書き出して、設計で決めます。

現場で確かめる問い

  • 冪等キーは業務の単位で付けられているか。通信の単位になっていないか
  • 「済み」の記録の保持期間は、再送が起こりうる最大の遅れから決めたか
  • 連携の相手が再送してきたとき、受け手が何を返すかを、相手と文書で合わせたか
  • 途中で止まったときの状態(記録あり処理なし、処理あり記録なし)を、どちらが安全か決めたか

アステリア案件で冪等キーをどう設計したかは、正本に記録がありません。記録なし

12. 人間が判断すること

  • 連携ごとに、どの方法で二重処理を防ぐか
  • 送り直しの手順と、送り直しを判断する人
  • 二重になったデータが見つかったときの直し方

13. 判断演習

あなたは、工数の連携の設計を確かめる担当です。

「同じ工数のデータが2回届いたとき、結果が1回分と同じになるか」を確かめるテストを、1つ考えてください。何を送り、何を確かめるかを書いてください。

あなたの記録あなたの考え。事実ではありません

判断ノート

既定では保存しないため、ページを離れると消えます。

このユニットで覚えてほしいこと

同じデータが2回届くことは、いつか必ず起きることとして設計します。

受け取る側で、2回来ても結果が変わらないようにしておけば、送り直しを安全に行えます。

次に読むもの

本文で参照している成果物:ARC-004 システム連携一覧、ARC-005 システム連携処理図、TST-002 テスト計画・対象一覧

関連成果物:未確定(baselineに対応表なし)

関連危機演習:未確定(baselineに対応表なし)

学習状況

状態:未着手