Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
既存のweb向け課金システムをそのままに、サーガパターンでのアプリ内課金システム構築
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
okatatuki
June 28, 2023
Technology
0
150
既存のweb向け課金システムをそのままに、サーガパターンでのアプリ内課金システム構築
AWS Dev Day 2023 Tokyo
E-4-2
https://aws.amazon.com/jp/events/devday/japan/
okatatuki
June 28, 2023
Tweet
Share
Other Decks in Technology
See All in Technology
~Everything as Codeを諦めない~ 後からCDK
mu7889yoon
3
530
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
430
Tebiki Engineering Team Deck
tebiki
0
24k
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
190
ブロックテーマ、WordPress でウェブサイトをつくるということ / 2026.02.07 Gifu WordPress Meetup
torounit
0
210
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
3
230
20260208_第66回 コンピュータビジョン勉強会
keiichiito1978
0
200
私たち準委任PdEは2つのプロダクトに挑戦する ~ソフトウェア、開発支援という”二重”のプロダクトエンジニアリングの実践~ / 20260212 Naoki Takahashi
shift_evolve
PRO
2
230
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
480
AWS DevOps Agent x ECS on Fargate検証 / AWS DevOps Agent x ECS on Fargate
kinunori
2
250
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.2k
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
2
260
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
The Curse of the Amulet
leimatthew05
1
8.7k
The Cult of Friendly URLs
andyhume
79
6.8k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Chasing Engaging Ingredients in Design
codingconduct
0
120
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
110
Transcript
既存のWeb向け課⾦システムをそのままに、 サーガパターンでのアプリ内課⾦システム構築 朝⽇新聞社 朝デジ事業センター カスタマーエクスペリエンス部 アーキテクト 岡本 樹
⾃⼰紹介 Copyright © The Asahi Shimbun Company. All rights reserved.
2 Okamoto Tatsuki 岡本 樹 2018年に朝⽇新聞社に新卒⼊社 以来、朝⽇新聞デジタルの開発にアプリケーション エンジニア・アーキテクトとして従事 好きなサービス︓Amazon Kinesis Data Streams 関⼼事︓ソフトウェアアーキテクチャ オブザーバビリティ
我々の主たるサービス︓朝⽇新聞デジタル Web App(Android/iOS) •朝⽇新聞社が提供するニュースサービス •Webサイトとモバイルアプリの両⽅を提供 •アプリはAndroid/iOSに対応 3 Copyright © The
Asahi Shimbun Company. All rights reserved.
我々の主たるサービス︓朝⽇新聞デジタル 4 Copyright © The Asahi Shimbun Company. All rights
reserved. •2023年3月9日にAndroid/iOSでアプリ内課金を実装 こちらのアプリ
アジェンダ 5 Copyright © The Asahi Shimbun Company. All rights
reserved. • アプリ内課⾦を実装するにあたっての課題 1.異なるデータソースで整合性を担保 • サーガパターンによる分散トランザクション 2.サーバ間通知ペイロードの保存 • サーバ間通知のデータロスト対策 3.仕様の異なるサーバ間通知 • 仕様の異なるサーバ間通知のリクエスト検証 • まとめ
なぜアプリ内課⾦をやるのか︖ 6 Copyright © The Asahi Shimbun Company. All rights
reserved. 従来Web側にしか導線がない状況
朝⽇新聞デジタルでの実現 7 Copyright © The Asahi Shimbun Company. All rights
reserved. Web購読導線の課題 •課⾦完了までの画⾯数が多く途中離脱率が⾼い •課⾦システムの修正が難しく、画⾯を減らすこと⾃体困難 アプリ内課⾦で実現したいこと •既存の課⾦システムに⼿を⼊れずに、モバイルアプリからの 購読操作を可能にしたい
なぜアプリ内課⾦をやるのか︖ 8 Copyright © The Asahi Shimbun Company. All rights
reserved. 変更コスト︓⼤
話すこと/話さないこと 9 •話すこと✅ •アプリ内課⾦を実現したアーキテクチャの紹介 •話さないこと❌ •詳細な実装について Copyright © The Asahi
Shimbun Company. All rights reserved.
課題の背景 10 Copyright © The Asahi Shimbun Company. All rights
reserved. •課⾦システムの制約 •変更コストが⾼く新規テーブル・データベースの追加が不可能 •朝⽇IDという独⾃のIDでしかユーザを表現不可能 そのためモバイルアプリ⽤ファサードで、App Store/Google Play のIDを朝⽇IDの仕様に合わせたり、購読の状態を永続化したい 課⾦システムとファサード間という異なるデータソースで整合性を 担保したい
課題の背景 11 Copyright © The Asahi Shimbun Company. All rights
reserved. •課⾦システムの制約 •変更コストが⾼く新規テーブル・データベースの追加が不可能 アプリ内課⾦の全ての購読操作はサーバ間通知で送信されるので、 その蓄積がしたいが、課⾦システム側での蓄積が難しい そのためモバイルアプリ⽤ファサードで、サーバ間通知ペイロード は確実に保存したい
課題の背景 12 Copyright © The Asahi Shimbun Company. All rights
reserved. •スコープと期限 •ビジネス上、3⽉リリースは厳守する必要 •ビジネス上、Android/iOSでの同時リリースをする必要 期限とスコープに余裕がない App Store/Google Playの仕様の異なるサーバ間通知について処 理を簡略化したい
アプリ内課⾦を実現するにあたっての課題 13 Copyright © The Asahi Shimbun Company. All rights
reserved. 異なるデータソース で整合性を担保 したい サーバ間通知 ペイロードを確実に 保存したい 仕様の異なる サーバ間通知
異なるデータソースで整合性を担保したい 14 Copyright © The Asahi Shimbun Company. All rights
reserved. •課題の背景 課⾦システムの変更コストが⾼く新規テーブル・データベースの追 加が不可能 •やりたいこと 課⾦システムでの購読の開始・更新・解除といった操作のため、 App Store/Google Play上で表現されるIDを朝⽇IDとして 取り扱いたい 朝デジ内で朝⽇ID以外 の認証・認可の仕組み がない
異なるデータソースで整合性を担保したい 15 Copyright © The Asahi Shimbun Company. All rights
reserved. そのためApp Store/Google Playと課⾦システムの間のシステムで、 ID仕様を課⾦システムに合わせる必要がある
どのように整合性を担保するか 16 Copyright © The Asahi Shimbun Company. All rights
reserved. モバイルアプリ⽤ファサードのデータベースと課⾦システムの間で、 各プラットフォームのIDを朝⽇IDの仕様に合わせて、購読状態をア トミックに永続化したい サーガパターンによる分散トランザクションを試みる
サーガパターンによる分散トランザクション サーガパターン1 ローカルトランザクションの順次処理で、1つでも処理が失敗した 場合は⼀連の処理に対して補償トランザクションを実⾏してサーガ 中の変更を以前の状態に戻す 17 [1] Neal Ford, Mark
Richards, Pramod Sadalage, Zhamak Dehghani 著, 島⽥浩⼆ 訳, ソフトウェアアーキテクチャ・ハードパーツ,オライリージャパン, 2022 Copyright © The Asahi Shimbun Company. All rights reserved.
18 Copyright © The Asahi Shimbun Company. All rights reserved.
補償トランザクション 成功後、 最初の購読開始処理は ロールバックされる
サーガパターンによる分散トランザクション 19 Copyright © The Asahi Shimbun Company. All rights
reserved. 正常系 1.リクエストを受け取ったら 2.App Store/Google Playに検証リクエストを送って 3.成功したら朝⽇IDプラットフォームに購読操作リクエストして 4.成功したらその結果を元に購読情報を保存して 5.基づくレスポンスをユーザ/サーバ間通知に返却する OK😁
サーガパターンによる分散トランザクション 20 Copyright © The Asahi Shimbun Company. All rights
reserved. 異常系 1.リクエストを受け取ったら 2.App Store/Google Playに検証リクエストを送って 3.成功したら朝⽇IDプラットフォームに購読操作リクエストして 4.成功したらその結果を元に購読情報を保存して 5.基づくレスポンスをユーザ/サーバ間通知に返却する データソースごとにロールバックしたい😢 ここでエラーすると課⾦システムとモバイル アプリ側ファサードで整合性がない状態に
サーガパターンによる分散トランザクション 21 Copyright © The Asahi Shimbun Company. All rights
reserved. 分散トランザクション の実施
サーガパターンによる分散トランザクション 22 Copyright © The Asahi Shimbun Company. All rights
reserved. 同期的に呼び出し オーケストレータ ① ② ③
サーガパターンによる分散トランザクション 23 Copyright © The Asahi Shimbun Company. All rights
reserved. 課⾦システムが停⽌して も、ワークフロー 全体 が停⽌してしまう 課⾦システムが停⽌しても、 ファサードのDBが 停⽌し てもワークフロー 全体が 停⽌してしまう
サーガパターンによる分散トランザクション 24 Copyright © The Asahi Shimbun Company. All rights
reserved. •モノリシックなシステムを模倣したトランザクション調整が可能 •全てのコンポーネントについてアトミック性を考慮するので、 全て成功するか、全てロールバックされるかとなり、可⽤性が 低くなる
アプリ内課⾦を実現するにあたっての課題 25 Copyright © The Asahi Shimbun Company. All rights
reserved. 異なるデータソース で整合性を担保 したい サーバ間通知 ペイロードを確実に 保存したい 仕様の異なる サーバ間通知
サーバ間通知ペイロードを確実に保存したい 26 Copyright © The Asahi Shimbun Company. All rights
reserved. • 課題の背景 課⾦システムの制約でユーザ問い合わせ対応に必要な情報も、モバイルアプリ⽤ ファサードで担保しなければならない • やりたいこと 全ての購読イベントはサーバ間通知で送られる その上解約や返⾦といったイベントは各プラットフォームからのみ送られるので、 問い合わせに対応できるようデータ⽋落を考慮する必要がある そのためサーバ間通知は重要なリクエストで、確実に保存する必要がある
サーバ間通知のデータロスト対策 27 Copyright © The Asahi Shimbun Company. All rights
reserved. •同期的にAmazon S3に保存したくない •保存失敗を理由にエラーさせるのは機会損失になりかねない •サーバ間通知の受信後、Amazon SQSにキューイング •SQSからは⾮同期にログ保存を⾏い、リトライやDLQを処理から 分離する
サーバ間通知のデータロスト対策 28 Copyright © The Asahi Shimbun Company. All rights
reserved.
29 Copyright © The Asahi Shimbun Company. All rights reserved.
AWS LambdaからペイロードをSQSに キューイング
30 Copyright © The Asahi Shimbun Company. All rights reserved.
SQSから⾮同期にS3にペイロードを保存 エラーしたイベントはDLQへ
31 Copyright © The Asahi Shimbun Company. All rights reserved.
SQSのイベントサイズが256KBなので ペイロードの仕様変更に注意が必要
アプリ内課⾦を実現するにあたっての課題 32 Copyright © The Asahi Shimbun Company. All rights
reserved. 異なるデータソース で整合性を担保 したい ペイロードを確実に 保存したい 仕様の異なる サーバ間通知
仕様の異なるサーバ間通知 33 Copyright © The Asahi Shimbun Company. All rights
reserved. •課題の背景 App Store/Google Playから送られる仕様の異なる署名リクエスト の検証をしなければならない •やりたいこと サーバ間通知の処理をできるだけ簡略化したい リクエスト元が正しく App Store/Google Playか検証
仕様の異なるサーバ間通知 34 Copyright © The Asahi Shimbun Company. All rights
reserved. Google Playはヘッダに署名検証⽤JWTがあるため検証処理が⾏いや すい⼀⽅、 App Storeは独⾃の仕組み 署名検証処理の実装に時間をかけたくない App Store/Google Playの仕様変更に逐次対応する必要があるので 保守性も担保したい
仕様の異なるサーバ間通知のリクエスト検証 35 Copyright © The Asahi Shimbun Company. All rights
reserved. 腐敗防⽌層をプラットフォームの数だけ分離 •App Store側 •独⾃の仕組みなので頑張ってLambdaに検証処理を実装しました💪 •Google Play側 •Amazon API Gatewayを採⽤ •HTTP APIを選択することで、署名検証をAPI Gatewayで実施、 実装コストの削減に成功した
仕様の異なるサーバ間通知のリクエスト検証 36 Copyright © The Asahi Shimbun Company. All rights
reserved. API Gatewayで 署名検証
まとめ︓アプリ内課⾦を実装するにあたっての課題 37 Copyright © The Asahi Shimbun Company. All rights
reserved. 異なるデータソース で整合性を担保 したい サーバ間通知 ペイロードを確実に 保存したい 仕様の異なる サーバ間通知 サーガパターンによる 分散トランザクション SQS + Lambda + S3で 非同期に保存 API Gatewayでの 署名検証
まとめ① 38 Copyright © The Asahi Shimbun Company. All rights
reserved. •課題 •異なるデータソースで整合性を担保したい •解決策 •サーガパターンによる分散トランザクション •同期的にかつアトミックにデータ永続化を⾏うパターンでの 実装を⾏うことで課⾦システムとモバイルアプリ⽤ファサー ド間で整合性が担保できた
まとめ② 39 Copyright © The Asahi Shimbun Company. All rights
reserved. •課題 •サーバ間通知ペイロードを確実に保存したい •解決策 •SQS + Lambda + S3の構成で⾮同期にペイロードを保存 できる
まとめ③ 40 Copyright © The Asahi Shimbun Company. All rights
reserved. •課題 •仕様の異なるサーバ間通知のリクエスト検証 •解決策 •プラットフォームごとに通知を受信する腐敗防止層を分離 することで、関心の分離を徹底できた •また、API Gatewayで署名検証を実施することで実装コストを削 減できた
We are hiring 41 Copyright © The Asahi Shimbun Company.
All rights reserved. 朝日新聞デジタルは 「みえるを広げる。みらいを照らす。」 をミッションに、 世の中の出来事を伝えるだけではなく「多様性」、 その⽣き⽅や考え⽅の“違い”を⼤切にして、 多くの⼈へ伝えていきます。 一緒に最高のメディアを作りませんか? 採用情報:https://www.asahishimbun-saiyou.com/techmedia/ 採⽤情報QRコード