Integration Architecture:API・Event・Batchを安全に進化させる
銀行applicationは単独で完結しません。同期API、message、event、batch、fileの契約と失敗意味を設計し、旧版と新版を止めずに進化させます。
Business・Application・Data・Technologyを横断し、全体最適の設計へ広げる。
先に学ぶ内容 — Prerequisite: 金融IT・信頼性学ぶこと — LEARNING GOALS
このページで学ぶこと
- Integration patternの選択
- 契約・version・互換性
- Timeout・Retry・重複・順序・照合
体験54 · INTEGRATION EVOLUTION(安全に進化させる)
Java Payment Serviceが失敗したら、自動的にlegacy経路へ切り替わるか確かめよう
まずは予想をひと言。本文を読んだ後、教材内の参照元で実際の切替設定を確認します。
- 01まず予想する — PREDICT
まずここだけ:思ったことをひと言書く
Java Payment Serviceが失敗したら、Next.jsは自動的に既存のlegacy経路へ切り替えてくれると思いますか?
正解でなくて大丈夫です。「〜だと思う」から始めてみましょう。
ヒント1を見る
『届いたはず』を前提にした設計は、再送があると何が起きるでしょうか?
ヒント2を見る
自動fallbackは、本当に安全と言えるでしょうか?
もっと詳しく:この問いで使う専門用語
- Contractは、送受信data、意味、error、互換性、SLOの約束です。
- Eventual Consistencyは、複数の状態が時間をかけて一致する設計です。
- Strangler Migrationは、旧systemの周囲へ新機能を置き、範囲を段階的に移す方法です。
日常語で理解する — PLAIN LANGUAGE
まず、ここだけつかむ
request/confirmはPAYMENT_BACKENDで選択します。未設定・空文字・legacyはNext.js→PostgREST RPC、javaはNext.js→Java Payment Service→PostgREST RPCです。不正な値はエラー、Javaのtimeout・5xx・通信断でもlegacyへ自動fallbackしません。旧OTP再発行はこの切替の対象外で、v7のRPCは常に42501で拒否します。TOTPの認可準備はNext.jsの/api/v1/transfers/mfaが担います。コードの存在は確認済みですが、本番・PreviewでJavaが選択されているかはUNKNOWNです。
IntegrationはAPI、event、batch、file、CDCを目的に応じて選び、contract、所有者、再送、順序、security、観測を設計します。
同期APIは即時結果に向き、eventは疎結合に向きますが、どちらも失敗と重複の責任を消しません。
更改は一括置換だけでなく、併存、shadow、段階切替、照合、切戻しを使って安全に進化させます。
順番に理解する — DIFFICULT PARTS, STEP BY STEP
難しいポイントを、順番にほどく
専門用語を覚えることより、「なぜ必要か」「このシステムのどこで使うか」を理解することが目標です。
Contract
送受信data、意味、error、互換性、SLOの約束です。
組織やrelease時期が違っても安全に連携するためです。
Next.jsとPayment Service間のAPI request/responseを明示します。
Eventual Consistency
複数の状態が時間をかけて一致する設計です。
即時atomic確定が難しい分散連携を扱うためです。
通知や分析projectionには使えてもLedger不変条件とは分けて考えます。
Strangler Migration
旧systemの周囲へ新機能を置き、範囲を段階的に移す方法です。
一括切替のriskを小さくするためです。
legacy経路を残しJava経路を限定的に検証する進め方です。
発展 — ADVANCEDもっと詳しく確認する最初の学習では読まなくても問題ありません。仕組みをもっと深く理解したい場合に開いてください。
Java経路の実装と稼働確認を分ける
request/confirmはPAYMENT_BACKENDで選択します。未設定・空文字・legacyはNext.js→PostgREST RPC、javaはNext.js→Java Payment Service→PostgREST RPCです。不正な値はエラー、Javaのtimeout・5xx・通信断でもlegacyへ自動fallbackしません。旧OTP再発行はこの切替の対象外で、v7のRPCは常に42501で拒否します。TOTPの認可準備はNext.jsの/api/v1/transfers/mfaが担います。コードの存在は確認済みですが、本番・PreviewでJavaが選択されているかはUNKNOWNです。
- 01Next.jsがPAYMENT_BACKENDを読む
- 02legacy:呼出者tokenでPostgRESTへ / java:Java Payment ServiceへHTTP
- 03request_transfer / confirm_transfer_otpでDB処理
- 04Javaの@TransactionalではHTTP先のcommitを取り消せない
- 05応答消失時は結果不明。別backendへ自動fallbackしない
連携方式を目的で選ぶ
| 方式 | 向く要求 | 主要risk |
|---|---|---|
| REST / gRPC | 即時応答・query・command | 連鎖障害、timeout、coupling |
| Command Message | 非同期に特定処理を依頼 | 重複実行、滞留 |
| Domain Event | 確定事実を複数consumerへ通知 | 順序、schema evolution、意味の乱用 |
| Batch / File | 大量・締め・外部legacy | cutoff、再送、部分受領 |
| CDC | data変更をstream化 | 業務意味不足、schema coupling |
契約に含めるもの
- request / response / event schemaとsemantic
- identity、idempotency、correlation、causation
- time:occurred、effective、received、business date
- error taxonomyとretryability
- ordering・delivery guarantee・deduplication scope
- security scope・data classification・consent
- capacity、timeout、rate limit、backpressure
- version、deprecation、consumer inventory
互換性を保つ移行
dual-writeは片側失敗を生むため安易に使いません。outbox、change capture、reconciliationなどで確定点を1つにします。
- 01Consumerと契約利用状況を可視化
- 02追加的なschema変更を先行
- 03producerが旧新を読める期間を作る
- 04shadow / mirrorで結果比較
- 05trafficを段階移行しmetricと照合を確認
- 06rollback可能期間を維持
- 07利用ゼロを証明して旧契約を廃止
Minibank Integration Review
| 境界 | 契約 | 確認 |
|---|---|---|
| Browser→Next.js | HTTP / form | auth、CSRF、二重click |
| Next.js→Java | Payment API | PAYMENT_BACKENDでlegacy/javaを明示選択。Java障害で自動fallbackしない。環境での選択はUNKNOWN |
| Java→PostgREST | RPC HTTP | token、SQLSTATE、timeout |
| PostgREST→PostgreSQL | function | signature、GRANT、transaction |
| Business→Ledger | DB内部event | 原子性、balanced journal |
| System→Operations | audit / issue | 検知、owner、resolution |
体験学習の続き · LEARNING LOOP
ここまで読めましたか?続けて確認してみましょう
ContractとStrangler Migrationの考え方を読んだところで、教材内の参照元で実際の切替設定を確認し、自分の言葉で説明してみます。
- 02仕組みを確かめる — CONCEPT CHECK
画面操作なしで、仕組みを確かめる
この仕組みは、Mini Bankの画面には現れません。次のEvidenceとCode Trail、教材本文だけで理解を進めます。
- 03証拠を確認する — EVIDENCE
何を見たか、1つずつ確かめる
Evidence(判断の根拠となる記録)を確認したらチェックします。各項目の「何を見るか」を手がかりにしてください。
画面を開けない項目は、Source Trail(教材の参照元)と教材の説明で確認できます。失敗を実際に起こす必要はありません。
- 04コードの処理経路を追う — CODE TRAIL
コードを書く必要はありません
ここでは「説明されている仕組みが、実際のMini Bankのどこに実装されているか」を確認します。まずは日本語の役割説明を読み、入力した依頼がどこへ渡るかをつかみましょう。コードの全文を読む必要はありません。
まず経路選択の設定を見て、次にJavaへのadapterを見ます。自動fallbackがどこにも無いことを確かめましょう。
教材の参照元を確認する — Source Trail ↓legacy/javaを検証する設定境界。
src/lib/config/paymentBackend.tsNext.jsからJavaへ渡すadapter。
src/services/JavaPaymentBackend.ts - 05自分の言葉で説明する — EXPLAIN
LEVEL 1 — やさしい説明(まずここだけ)
なぜIntegrationの契約では『届いたはず』ではなく、idempotencyや状態照会など再送前提の設計が必要なのでしょうか? 短い2文を目安に説明してください。
日常語だけで完了できます。専門用語の数や正誤を自動採点するものではありません。
ヒント1を見る
「Contract」という言葉を使って書いてみましょう。
ヒント2を見る
曖昧な自動対応と、明示的なエラーのどちらが安全か考えてみましょう。
もっと詳しく:LEVEL 2 — 専門用語を使った説明(任意)
Contract、Eventual Consistency、Strangler Migrationの3つを使って、Integrationを安全に進化させる方法を説明してみましょう。
挑戦する場合は、上の説明欄に追記できます。追加しなくても完了できます。
説明の確認ポイント — Checkpoint- Java障害時に自動fallbackしないと説明できる
- 再送前提の設計が必要だと説明できる
理解を確かめる — CHECK YOUR UNDERSTANDING
4問で理解チェック
答えを頭の中で考えてから、各項目を開いて確認してください。
Q1eventを使えば疎結合になりますか?
自動的にはなりません。schema、意味、順序、共有data、運用で強く結合する場合があります。
Q2成功応答が失われたとき何が必要ですか?
idempotency、status照会、correlation、retry方針、顧客への確定状態表示が必要です。
Q3Java障害でlegacyへ自動fallbackしますか?
request/confirmはPAYMENT_BACKENDで選択します。未設定・空文字・legacyはNext.js→PostgREST RPC、javaはNext.js→Java Payment Service→PostgREST RPCです。不正な値はエラー、Javaのtimeout・5xx・通信断でもlegacyへ自動fallbackしません。旧OTP再発行はこの切替の対象外で、v7のRPCは常に42501で拒否します。TOTPの認可準備はNext.jsの/api/v1/transfers/mfaが担います。コードの存在は確認済みですが、本番・PreviewでJavaが選択されているかはUNKNOWNです。
Q4安全な切替の証拠は何ですか?
同一入力比較、差異分析、capacity、障害試験、切戻し試験、業務照合です。
完全に暗記する必要はありません。大切な考え方を説明できそうなら押してください。
業界・外部の参照元 — INDUSTRY / EXTERNAL SOURCE
業界資料・参考文献
一般論と業界知識の根拠です。外部サイトを新しいタブで開きます。
- BIAN — Service Landscape
銀行業務capabilityをService Domainとして整理する業界参照構造
- The Open Group — TOGAF Standard, 10th Edition
Enterprise Architectureの方法、領域、governance、migration planningの基礎
教材の参照元 — SOURCE TRAIL
根拠と関連教材
CURRENT IMPLEMENTATIONは確認したrepository内の実装です。HISTORICAL IMPLEMENTATIONは導入・修正の履歴で、後続migrationによる再定義があり得ます。RELATED LESSONは教材への案内で、実装の一次Sourceではありません。ASSUMPTIONは仮定、UNKNOWNは未確認を表します。
確認基点: d02eae8914f39cbf06bfe422dc39c71886f82b3e / 2026-09-11。稼働環境への適用確認: UNKNOWN。パス実在の自動検査と、記述した技術的事実の確認は別です。
Implementation Status: IMPLEMENTED IN MINIBANK(この教材が扱うコードの範囲)
Runtime Verification Status: UNKNOWN(本番・Previewでの経路選択)
- 現在の実装 — CURRENT IMPLEMENTATION — Primary Source
src/lib/config/paymentBackend.tsgetPaymentBackend切替の許容値・default・不正値拒否。稼働環境の値はUNKNOWN。 - 現在の実装 — CURRENT IMPLEMENTATION — Primary Source
src/services/TransferService.tsrequestTransfer / confirmTransferOtp / reissueTransferOtprequest/confirmのみbackend切替。残存createTransfer関数のコメントは現ACLの根拠にしない。 - 現在の実装 — CURRENT IMPLEMENTATION
src/services/JavaPaymentBackend.tsJavaへのHTTP adapterとエラー処理。自動fallbackなし。 - 現在の実装 — CURRENT IMPLEMENTATION
src/app/api/v1/既存HTTP契約 - 現在の実装 — CURRENT IMPLEMENTATION
services/payment-service/src/main/java/com/minibank/payment/repository/Java→PostgREST境界 - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/RPC signatureとbusiness transaction