Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
既存のweb向け課金システムをそのままに、サーガパターンでのアプリ内課金システム構築
Search
okatatuki
June 28, 2023
Technology
150
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
既存のweb向け課金システムをそのままに、サーガパターンでのアプリ内課金システム構築
AWS Dev Day 2023 Tokyo
E-4-2
https://aws.amazon.com/jp/events/devday/japan/
okatatuki
June 28, 2023
Other Decks in Technology
See All in Technology
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
470
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
WasmをRustにする
sansantech
PRO
0
280
S3 Filesで挑む! 八戸せんべい汁の食べ頃問題
usanchuu
0
120
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
740
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.4k
DBについての基礎説明(MySQL編) - コロプラ 2026年度 新卒研修
colopl
0
130
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
190
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
160
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.8k
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
690
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
230
Featured
See All Featured
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
830
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
We Are The Robots
honzajavorek
0
400
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
220
Agile that works and the tools we love
rasmusluckow
331
22k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Designing Experiences People Love
moore
143
24k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How to build a perfect <img>
jonoalderson
1
6.1k
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コード