101 Views
June 24, 26
スライド概要
登壇者: 星原 宏紀(ウェルスナビ株式会社 サービス基盤グループ ソフトウェアエンジニアリングチーム)
2026/06/24 開催
「JJUG CCC 2026 Spring延長戦!登壇者3名が時間内には語れなかったリアルを深掘ります」
登壇資料
主催: ウェルスナビ株式会社
共催: 株式会社コドモン、サイボウズ株式会社
詳細: https://wealthnavi.connpass.com/event/394248/
ウェルスナビ株式会社 技術広報チームの公式アカウントです。
Transactional Outbox Pattern を使った データ連携方法の紹介 2026.6.24 JJUG CCC 2026 Spring延⻑戦! サービス基盤グループ ソフトウェアエンジニアリングチーム 星原 宏紀
⾃⼰紹介 星原 宏紀 (Koki Hoshihara) ウェルスナビ株式会社 サービス基盤グループ ソフトウェアエンジニアリング (SWE) チーム ウェルスナビでは 共通ライブラリ開発(⼤規模バッチ / 認証系)、バックエンド開発、 新規システムのパフォーマンスチューニング、新技術導⼊ を推進 ひとこと JJUGではイベント駆動を⽤いたデータ連携⽅法をお話ししました! 本⽇はよろしくお願いします! 2 @2025 WealthNavi Inc.
アジェンダ はじめに Spring Cloud AWS を活⽤したイベント駆動アーキテクチャ (Transactional Outbox Patternを使って Atomic に イベントをPublish する⽅法を紹介) 3
1 はじめに © WealthNavi Inc. All Rights Reserved. 4
はじめに 本セッションのターゲットは、以下のいずれかに当てはまる⽅を想定します ● ● Java、Spring Bootを使ったデータ連携の開発に興味がある Transactional Outbox Patternを使ったデータ連携⽅法に興味がある © WealthNavi Inc. All Rights Reserved. 5
JJUG資料の 再掲 従来のデータ連携のアーキテクチャ全体像 個別実装による属⼈化された APIによる同期データ連携 NativeApp Public API API WebApp Internet ServerSide xxClient PrivateProxy ThirdParty/ SaaS API Internet API xxSDK Private xxService API ServerSide External xxClient API クライアント層 サービス層 同期データ連携が適切でない © WealthNavi Inc. All Rights Reserved. 6
JJUG資料の 再掲 本⽇はイベント駆動型データ連携について話します API Gateway導⼊ NativeApp Public API API WebApp Internet ServerSide xxClient PrivateProxy ThirdParty/ SaaS API Internet API xxSDK Private xxService ServerSide External xxClient API クライアント層 © WealthNavi Inc. All Rights Reserved. API サービス層 イベント駆動型 データ連携導⼊ 7
2 1 Spring Cloud AWS を活⽤した イベント駆動アーキテクチャ © WealthNavi Inc. All Rights Reserved. 8
Spring Cloud AWS を活⽤したイベント駆動アーキテクチャ 1. イベント駆動アーキテクチャ採⽤の動機付け 2. Pub/Subの概念とAWSでの構成 3. Transactional Outbox Pattern による Atomic な Publisher の実装 © WealthNavi Inc. All Rights Reserved. 9
JJUG資料の 再掲 API 連携とイベント駆動型データ連携の整理 ● ● API 連携(同期):呼び出し結果をその場で確認できる。 イベント駆動型(⾮同期):1対多で配信できるため、スケールアウトしやすい(※)。 API 連携 イベント駆動型データ連携 Request - Response Pub/Sub 連携 連携先 A ① Request 呼び出し元 呼び出し先 ② Response ① Publish Message Publisher Broker ② Subscribe 連携先 B © WealthNavi Inc. All Rights Reserved. (※)補足:以降「Pub/Sub 連携」と記載。 10
イベント駆動型への移⾏によるメリット JJUG資料の 再掲 更新処理をイベントに分離することで、呼び出し元の責務を減らし、連携先の追加や⼀時 的なエラーに対するリトライを扱いやすくする。 ● API連携で更新処理を担う場合の課題 課題①:呼び出し元の複雑化 ● 連携先の状態に応じた複雑な制御が必要 ● リトライロジックが肥⼤化 課題②:連携先サービス障害時の復旧負荷が⾼い ● 障害時は該当時間帯の処理が⼀律失敗する ため、呼び出し元が再実⾏を管理する必要 がある © WealthNavi Inc. All Rights Reserved. イベント駆動型を採⽤した場合の対応 解決策①-1:更新処理の簡素化 ● ⾮同期化でトランザクション制御を簡素化 解決策①-2:主体性の明確化 ● 更新の責任範囲がアーキテクチャ上で明確 解決策②-1:復旧時のバースト負荷を吸収 ● キューイングで再処理の負荷を平準化 解決策②-2:更新失敗の影響を局所化 ● 復旧後キューの内容に基づき再処理可能 11
イベント駆動型の採⽤判断基準 ● JJUG資料の 再掲 イベント駆動の採⽤可否は、処理結果の即時確認が必要かどうかを主な判断軸とする。 更新結果の 即時確認が必要 な処理は、 API連携 が向いている 具体的には、処理の成否をその場で確認し、エラー時に即座に対応する必要がある場合 ● 例)即時の入金・出金処理 更新結果の 即時確認が不要 な処理は、 イベント駆動 が向いている 具体的には、⾮同期で処理でき、失敗時もリトライで対応できる場合 ● 例)外部サービスへの連携、メール送信 © WealthNavi Inc. All Rights Reserved. 12
Spring Cloud AWSを活⽤したイベント駆動アーキテクチャ 1. イベント駆動アーキテクチャ採⽤の動機付け 2. Pub/Subの概念とAWSでの構成 3. Transactional Outbox Pattern によるAtomicなPublisherの実装 © WealthNavi Inc. All Rights Reserved. 13
JJUG資料の 再掲 イベント駆動を実現する Pub/Sub の概念を改めて紹介 Pub/Sub とは、イベントを送る側(Publisher)が仲介役(Message Broker)に イベントを送出し、イベントを受け取る側(Subscriber)がMessage Broker内の ⼀時的な蓄積場所(Queue)からメッセージを受け取って処理するアーキテクチャ Message Broker Publisher Event Queue Subscriber イベントの送出元 メッセージの分類 ⼀時的な蓄積 イベントの受信‧処理 データの流れ © WealthNavi Inc. All Rights Reserved. 14
JJUG資料の 再掲 AWS で Pub/Sub を構成する場合のアーキテクチャ AWSでの実践事例(ウェルスナビの場合) Publisher/Subscriberにはコンテナランタイム(Amazon ECS)を活⽤する Topic、Queueの管理にはAmazon SNS、SQSをそれぞれ活⽤する Message Broker ECS SNS SQS Publisher Topic管理 Queue管理 ECS Subscriber データの流れ © WealthNavi Inc. All Rights Reserved. 参考:https://www.docswell.com/s/WN_Tech-PR/KPG18L-2025-11-20-154347#p18 15
Spring Cloud AWS を活⽤したイベント駆動アーキテクチャ 1. イベント駆動アーキテクチャ採⽤の動機付け 2. Pub/Subの概念とAWSでの構成 3. Transactional Outbox Pattern による Atomic な Publisher の実装 © WealthNavi Inc. All Rights Reserved. 16
Spring Boot で SNS へ Publish する⽅法 JJUG資料の 再掲 SnsTemplate を利⽤して、SNS Topic にメッセージを Publish する ● Publisher は 連携先の SQS Queue を意識しない ● Topic へのイベントは SNS Subscription が各 SQS Queue に配送する ● 連携先が増えても、Publisher 側の実装変更を抑えやすい © WealthNavi Inc. All Rights Reserved. 17
Spring Boot で SNS へ Publish する⽅法 (Publisher を分解) Publisher は「業務処理」と「SNS への Publish」の 2 ステップで構成される。 ● ● シンプルな構成を検討すると以下などが考えられる。 ただし、課題はある(後述)。 Publisher SNS ② Publish ① 業務処理 Business Table © WealthNavi Inc. All Rights Reserved. ①と②を同じトランザクションにしても ②(外部へのPublish)はロールバック できない 18
業務 DB 更新と SNS への Publish を直列に⾏うことの課題 DB 更新と SNS Publish を直列に⾏うと、両者の結果が整合しない可能性がある ● どちらか⼀⽅だけ成功すると、DBの状態とイベント発⾏結果が整合しない。 ケース1: Publish 成功後に commit 失敗 ケース2: commit 後に Publish 失敗 1. 2. 3. 1. 2. 3. 業務処理で DB 更新(未 commit) SNS へPublish 成功 commit 失敗(DBエラー等) DBは未更新にもかかわらずイベントが発⾏ 業務処理で DB 更新(未 commit) commit 成功 SNS へ Publish 失敗(NW障害等) DBは更新済みだがイベントが未発⾏ DB更新 と SNSへのPublish は 1つの Atomic な操作 にしたい © WealthNavi Inc. All Rights Reserved. 19
Spring Boot で SNS へ Publish する⽅法 (Outbox Table を採⽤したサンプル) Publisher は「業務処理」と「SNS への Publish」の 2 ステップで構成される。 ● ● DB の状態とイベント発⾏結果を⼀致させる必要がある 確実に Publish するために、Outboxテーブルを活⽤した状態管理を実装する。 Publisher ①と②は同じ トランザクション で実装する ① 業務処理 Business Table ②登録 Outbox Table Outbox Poller SNS ④ Publish ③取得 ⑤発⾏済みに更新 ④成功後に ⑤を実⾏する © WealthNavi Inc. All Rights Reserved. 20
Java(Spring Boot)とAWSの組み合わせで Transactional Outbox Pattern を実装する際のポイントと注意事項 Outboxへの 保存 ● ● 業務 DB の更新と Outboxテーブルへの登録を同⼀トランザクションで⾏う。 SNS Publishはこのトランザクション内では呼ばない。 Outboxの ポーリング ● ● @Scheduled などで Outbox テーブルをポーリングして未発⾏の⾏を取得。 別 ECS タスクに分離することで業務処理と独⽴してスケールできる。 Publishと Outboxの更新 ● ● Publish 後、Outbox テーブルの発⾏ステータスを発⾏済みに更新。 失敗時は未発⾏の⾏のまま残り再試⾏。 注意事項 ● Transactional Outbox Pattern はイベント発⾏失敗時に再試⾏することを前提とする。 そのためイベントが重複発⾏されうるので以下のリスクがある。対策の⼀例として紹介。 ○ リスク:Publish 後の DB 更新に失敗して⼆重に発⾏される。 ■ 対策:Subscriber で冪等性設計できるようにイベントごとに⼀意なキーをメッセージに含める。 ○ リスク:Publish 失敗に伴う未発⾏状態の発⽣ ■ 対策:⼀定時間未発⾏の⾏を検知し通知するバッチ処理の導⼊ © WealthNavi Inc. All Rights Reserved. 21
Outbox パターンの実装サンプルは以下のテックブログを参照ください! © WealthNavi Inc. All Rights Reserved. 22
ご清聴ありがとうございました! © WealthNavi Inc. All Rights Reserved. 23
重要な注意事項 ● 本資料は、断定的判断を提供するものではなく、情報を提供することのみを目的としており、いかなる種類の商品も勧誘 するものではありません。最終的な決定は、お客様自身で判断するものとし、当社はこれに一切関与せず、また、一切の 責任を負いません。 ● 本資料には将来の出来事に関する予想が含まれている場合がありますが、それらは予想であり、また、本資料の内容の 正確性、信頼性、完全性、適時性等を一切保証するものではありません。本資料に基づいて被ったいかなる損害について も、当社は一切の責任を負いません。また、当社は、新しい情報や将来の出来事その他の情報について、更新又は訂正 する義務を負いません。 ● 本資料を利用することによりお客様に生じた直接的損害、間接的損害、派生的損害その他いかなる損害についても、当社 は一切の責任を負いません。 商号等:ウェルスナビ株式会社 金融商品取引業者 関東財務局長(金商) 第2884号 加入協会:日本証券業協会 一般社団法人資産運用業協会 © WealthNavi Inc. All Rights Reserved. 24