Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Transactional Outbox Pattern を使った データ連携方法の紹介

Transactional Outbox Pattern を使った データ連携方法の紹介

「JJUG CCC 2026 Spring延長戦!登壇者3名が時間内には語れなかったリアルを深掘ります」 の登壇資料です
https://wealthnavi.connpass.com/event/394248/

Avatar for Koki Hoshihara

Koki Hoshihara PRO

June 30, 2026

More Decks by Koki Hoshihara

Other Decks in Technology

Transcript

  1. @2025 WealthNavi Inc. 星原 宏紀 (Koki Hoshihara) ウェルスナビ株式会社 サービス基盤グループ ソフトウェアエンジニアリング (SWE)

    チーム ⾃⼰紹介 2 ひとこと JJUGではイベント駆動を⽤いたデータ連携⽅法をお話ししました! 本⽇はよろしくお願いします! ウェルスナビでは 共通ライブラリ開発(⼤規模バッチ / 認証系)、バックエンド開発、 新規システムのパフォーマンスチューニング、新技術導⼊ を推進
  2. © WealthNavi Inc. All Rights Reserved. 5 • Java、Spring Bootを使ったデータ連携の開発に興味がある

    • Transactional Outbox Patternを使ったデータ連携⽅法に興味がある 本セッションのターゲットは、以下のいずれかに当てはまる⽅を想定します はじめに
  3. © WealthNavi Inc. All Rights Reserved. 6 従来のデータ連携のアーキテクチャ全体像 Private API

    PrivateProxy API ThirdParty/ SaaS API API ServerSide Public WebApp NativeApp Internet xxClient xxSDK xxService Internet クライアント層 サービス層 API ServerSide xxClient External API 個別実装による属⼈化された APIによる同期データ連携 同期データ連携が適切でない JJUG資料の 再掲
  4. © WealthNavi Inc. All Rights Reserved. 7 本⽇はイベント駆動型データ連携について話します Private API

    PrivateProxy API ThirdParty/ SaaS API API ServerSide Public WebApp NativeApp Internet xxClient xxSDK xxService Internet クライアント層 サービス層 API ServerSide xxClient External API API Gateway導⼊ イベント駆動型 データ連携導⼊ JJUG資料の 再掲
  5. © WealthNavi Inc. All Rights Reserved. 1 Spring Cloud AWS

    を活⽤した イベント駆動アーキテクチャ 2 8
  6. © WealthNavi Inc. All Rights Reserved. 9 Spring Cloud AWS

    を活⽤したイベント駆動アーキテクチャ 1. イベント駆動アーキテクチャ採⽤の動機付け 2. Pub/Subの概念とAWSでの構成 3. Transactional Outbox Pattern による Atomic な Publisher の実装
  7. © WealthNavi Inc. All Rights Reserved. 10 • API 連携(同期):呼び出し結果をその場で確認できる。

    • イベント駆動型(⾮同期):1対多で配信できるため、スケールアウトしやすい(※)。 API 連携 Request - Response 呼び出し元 呼び出し先 ① Request ② Response イベント駆動型データ連携 Pub/Sub 連携 Publisher 連携先 A 連携先 B ① Publish ② Subscribe Message Broker API 連携とイベント駆動型データ連携の整理 (※)補足:以降「Pub/Sub 連携」と記載。 JJUG資料の 再掲
  8. © WealthNavi Inc. All Rights Reserved. 11 API連携で更新処理を担う場合の課題 課題①:呼び出し元の複雑化 •

    連携先の状態に応じた複雑な制御が必要 • リトライロジックが肥⼤化 課題②:連携先サービス障害時の復旧負荷が⾼い • 障害時は該当時間帯の処理が⼀律失敗する ため、呼び出し元が再実⾏を管理する必要 がある イベント駆動型を採⽤した場合の対応 解決策①-1:更新処理の簡素化 • ⾮同期化でトランザクション制御を簡素化 解決策①-2:主体性の明確化 • 更新の責任範囲がアーキテクチャ上で明確 解決策②-1:復旧時のバースト負荷を吸収 • キューイングで再処理の負荷を平準化 解決策②-2:更新失敗の影響を局所化 • 復旧後キューの内容に基づき再処理可能 • 更新処理をイベントに分離することで、呼び出し元の責務を減らし、連携先の追加や⼀時 的なエラーに対するリトライを扱いやすくする。 イベント駆動型への移⾏によるメリット JJUG資料の 再掲
  9. © WealthNavi Inc. All Rights Reserved. イベント駆動型の採⽤判断基準 更新結果の 即時確認が必要 な処理は、

    API連携 が向いている 具体的には、処理の成否をその場で確認し、エラー時に即座に対応する必要がある場合 • 例)即時の入金・出金処理 更新結果の 即時確認が不要 な処理は、 イベント駆動 が向いている 具体的には、⾮同期で処理でき、失敗時もリトライで対応できる場合 • 例)外部サービスへの連携、メール送信 • イベント駆動の採⽤可否は、処理結果の即時確認が必要かどうかを主な判断軸とする。 12 JJUG資料の 再掲
  10. © WealthNavi Inc. All Rights Reserved. 13 1. イベント駆動アーキテクチャ採⽤の動機付け 2.

    Pub/Subの概念とAWSでの構成 3. Transactional Outbox Pattern によるAtomicなPublisherの実装 Spring Cloud AWSを活⽤したイベント駆動アーキテクチャ
  11. © WealthNavi Inc. All Rights Reserved. イベント駆動を実現する Pub/Sub の概念を改めて紹介 

    Publisher イベントの送出元 Message Broker  Event メッセージの分類  Queue ⼀時的な蓄積  Subscriber イベントの受信‧処理 Pub/Sub とは、イベントを送る側(Publisher)が仲介役(Message Broker)に イベントを送出し、イベントを受け取る側(Subscriber)がMessage Broker内の ⼀時的な蓄積場所(Queue)からメッセージを受け取って処理するアーキテクチャ データの流れ 14 JJUG資料の 再掲
  12. © WealthNavi Inc. All Rights Reserved. 15 AWS で Pub/Sub

    を構成する場合のアーキテクチャ AWSでの実践事例(ウェルスナビの場合) Publisher/Subscriberにはコンテナランタイム(Amazon ECS)を活⽤する Topic、Queueの管理にはAmazon SNS、SQSをそれぞれ活⽤する  ECS Publisher Message Broker  SNS Topic管理  SQS Queue管理  ECS Subscriber データの流れ 参考:https://www.docswell.com/s/WN_Tech-PR/KPG18L-2025-11-20-154347#p18 JJUG資料の 再掲
  13. © WealthNavi Inc. All Rights Reserved. 16 1. イベント駆動アーキテクチャ採⽤の動機付け 2.

    Pub/Subの概念とAWSでの構成 3. Transactional Outbox Pattern による Atomic な Publisher の実装 Spring Cloud AWS を活⽤したイベント駆動アーキテクチャ
  14. © WealthNavi Inc. All Rights Reserved. Spring Boot で SNS

    へ Publish する⽅法 SnsTemplate を利⽤して、SNS Topic にメッセージを Publish する • Publisher は 連携先の SQS Queue を意識しない • Topic へのイベントは SNS Subscription が各 SQS Queue に配送する • 連携先が増えても、Publisher 側の実装変更を抑えやすい 17 JJUG資料の 再掲
  15. © WealthNavi Inc. All Rights Reserved. SNS Business Table Publisher

    Spring Boot で SNS へ Publish する⽅法 (Publisher を分解) 18 Publisher は「業務処理」と「SNS への Publish」の 2 ステップで構成される。 • シンプルな構成を検討すると以下などが考えられる。 • ただし、課題はある(後述)。 ② Publish ① 業務処理 ①と②を同じトランザクションにしても ②(外部へのPublish)はロールバック できない
  16. © WealthNavi Inc. All Rights Reserved. 業務 DB 更新と SNS

    への Publish を直列に⾏うことの課題 19 ケース2: commit 後に Publish 失敗 1. 業務処理で DB 更新(未 commit) 2. commit 成功 3. SNS へ Publish 失敗(NW障害等) DBは更新済みだがイベントが未発⾏ DB 更新と SNS Publish を直列に⾏うと、両者の結果が整合しない可能性がある • どちらか⼀⽅だけ成功すると、DBの状態とイベント発⾏結果が整合しない。 ケース1: Publish 成功後に commit 失敗 1. 業務処理で DB 更新(未 commit) 2. SNS へPublish 成功 3. commit 失敗(DBエラー等) DBは未更新にもかかわらずイベントが発⾏ DB更新 と SNSへのPublish は 1つの Atomic な操作 にしたい
  17. © WealthNavi Inc. All Rights Reserved. SNS Business Table Publisher

    Spring Boot で SNS へ Publish する⽅法 (Outbox Table を採⽤したサンプル) 20 Publisher は「業務処理」と「SNS への Publish」の 2 ステップで構成される。 • DB の状態とイベント発⾏結果を⼀致させる必要がある • 確実に Publish するために、Outboxテーブルを活⽤した状態管理を実装する。 Outbox Poller Outbox Table ④ Publish ① 業務処理 ②登録 ③取得 ①と②は同じ トランザクション で実装する ⑤発⾏済みに更新 ④成功後に ⑤を実⾏する
  18. © WealthNavi Inc. All Rights Reserved. Java(Spring Boot)とAWSの組み合わせで Transactional Outbox

    Pattern を実装する際のポイントと注意事項 21 • 業務 DB の更新と Outboxテーブルへの登録を同⼀トランザクションで⾏う。 • SNS Publishはこのトランザクション内では呼ばない。 Outboxへの 保存 • @Scheduled などで Outbox テーブルをポーリングして未発⾏の⾏を取得。 • 別 ECS タスクに分離することで業務処理と独⽴してスケールできる。 Outboxの ポーリング • Publish 後、Outbox テーブルの発⾏ステータスを発⾏済みに更新。 • 失敗時は未発⾏の⾏のまま残り再試⾏。 Publishと Outboxの更新 注意事項 • Transactional Outbox Pattern はイベント発⾏失敗時に再試⾏することを前提とする。 そのためイベントが重複発⾏されうるので以下のリスクがある。対策の⼀例として紹介。 ◦ リスク:Publish 後の DB 更新に失敗して⼆重に発⾏される。 ▪ 対策:Subscriber で冪等性設計できるようにイベントごとに⼀意なキーをメッセージに含める。 ◦ リスク:Publish 失敗に伴う未発⾏状態の発⽣ ▪ 対策:⼀定時間未発⾏の⾏を検知し通知するバッチ処理の導⼊
  19. © WealthNavi Inc. All Rights Reserved. • 本資料は、断定的判断を提供するものではなく、情報を提供することのみを目的としており、いかなる種類の商品も勧誘 するものではありません。最終的な決定は、お客様自身で判断するものとし、当社はこれに一切関与せず、また、一切の 責任を負いません。

    • 本資料には将来の出来事に関する予想が含まれている場合がありますが、それらは予想であり、また、本資料の内容の 正確性、信頼性、完全性、適時性等を一切保証するものではありません。本資料に基づいて被ったいかなる損害について も、当社は一切の責任を負いません。また、当社は、新しい情報や将来の出来事その他の情報について、更新又は訂正 する義務を負いません。 • 本資料を利用することによりお客様に生じた直接的損害、間接的損害、派生的損害その他いかなる損害についても、当社 は一切の責任を負いません。 商号等:ウェルスナビ株式会社 金融商品取引業者 関東財務局長(金商) 第2884号 加入協会:日本証券業協会 一般社団法人 資産運用業協会 重要な注意事項 24