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
WinTicketにおける リアルタイム性と高負荷を考慮したアーキテクチャ/WinTicket...
Search
Hiroaki Egashira
October 18, 2019
Technology
4
3.7k
WinTicketにおける リアルタイム性と高負荷を考慮したアーキテクチャ/WinTicket Architecture
Hiroaki Egashira
October 18, 2019
Tweet
Share
More Decks by Hiroaki Egashira
See All by Hiroaki Egashira
レコメンドへの大規模アクセスを支えるGo製サーバーの裏側
_hiro511
7
3.8k
WinTicketにおけるライブ配信システムの実現
_hiro511
2
860
MicroServices and MonoRepo
_hiro511
2
1.3k
Other Decks in Technology
See All in Technology
Regional_NAT_Gatewayについて_basicとの違い_試した内容スケールアウト_インについて_IPv6_dual_networkでの使い分けなど.pdf
cloudevcode
1
130
re:Inventで見つけた「運用を捨てる」技術。
ezaki
1
140
AWSと暗号技術
nrinetcom
PRO
1
170
メルカリのAI活用を支えるAIセキュリティ
s3h
3
2.3k
フロントエンド開発者のための「厄払い」
optim
0
170
AWS Devops Agent ~ 自動調査とSlack統合をやってみた! ~
kubomasataka
2
200
AI時代にあわせたQA組織戦略
masamiyajiri
5
2.4k
Claude Codeベストプラクティスまとめ
minorun365
44
25k
Riverpod3.xで実現する実践的UI実装
fumiyasac0921
2
340
持続可能な開発のためのミニマリズム
sansantech
PRO
4
570
Amazon Bedrock AgentCore EvaluationsでAIエージェントを評価してみよう!
yuu551
0
170
人はいかにして 確率的な挙動を 受け入れていくのか
vaaaaanquish
4
2.5k
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Believing is Seeing
oripsolob
1
39
Context Engineering - Making Every Token Count
addyosmani
9
630
Darren the Foodie - Storyboard
khoart
PRO
2
2.2k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
310
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
The agentic SEO stack - context over prompts
schlessera
0
600
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
190
Transcript
WinTicketにおける リアルタイム性と⾼負荷を考慮した アーキテクチャ 株式会社サイバーエージェント 江頭 宏亮
江頭 宏亮 えがしら ひろあき • 2018年4⽉ 株式会社サイバーエージェント⼊社 CATS(CyberAgent Advanced Technology
Studio) • WinTicket - 公営競技事業 バックエンド テックリード hiro _hiro
本⽇の内容 • WinTicketとは • 全体アーキテクチャ • 情報のリアルタイム性の実現 • 投票券の購⼊‧精算時の負荷対策
WinTicketとは
WinTicket • オンライン競輪投票サービス • ウェブとiOS‧Androidアプリを提供 • いつでも投票券を購⼊可能 • 全国43会場のライブ映像を配信 •
AbemaTVの競輪チャンネルと連動
全体アーキテクチャ
技術選定
None
Kubernetes マイクロサービスアーキテクチャ • 36種類のマイクロサービスが稼働 • ゲートウェイ パターン • アンバサダー パターン
• オートスケール
• 可⽤性の向上に貢献 Outlier Detection, Circuit Breaking Load Balancing, Retry, etc
• ロギングなどを任せることで ロジックの開発に集中 Envoy サービスメッシュを構成
Cloud Spanner ⽔平スケール可能なリレーショナル データベース
• 選定理由 ⾦銭の取引があるのでトランザクション必須 購⼊できないと(ダウンタイムは)事業的損失が⼤きい レースの締切直前と結果確定直後に書き込み負荷が⼤きい • 性能(1インスタンスあたり) リード:最⼤10,000 QPS, ライト:最⼤2,000
QPS Cloud Spanner ⾼可⽤性 SLA . %
リアルタイム性
最新の情報を すぐに届ける必要がある
競輪決済システムのプロキシではない
投票システムのプロキシではない 購⼊‧払い戻しの全ての責任を負う • 競輪システムから取得できる情報は出⾛表とオッズと結果ぐらい • 取得できた情報をもとに販売可能な投票券と払い戻す投票券を判断 • 競輪システムには投票券の販売状況を定期的に報告 誤販売を防ぐために情報のリアルタイム性は重要
リアルタイム性 最新の情報をすぐにユーザーへ届ける必要がある • 変わりやすい‧すぐに届けたい情報 オッズ、出⾛表、レース結果 • 情報量が多い レース詳細情報を取得するAPIのレスポンスは約 KB
Fastly Instant Purgeが決め⼿ • ms以内にキャッシュをパージできる • レスポンスヘッダーにサロゲートキーを設定することで そのキー単位でパージできる • VarnishベースなのでVCLで設定できる
• 導⼊した結果 ⼿元の環境では 20KB超えAPIも20msほどのレイテンシに抑えられている データベースへの負荷も抑えられた
singleflight 関数の重複呼び出しを抑制するメカニズム • キャッシュミス時のオリジンアクセスの負荷を抑えられる • キーに対して同時に1つの実⾏しか⾏わない • 重複した関数呼び出しは最初の実⾏を待ち、その結果を返す • 時間的局所性がある場合に効果的
⾼負荷
負荷がかかるタイミング • レース締め切り直前 締め切りギリギリに購⼊が集中する • レースの結果確定直後 結果確定後にすぐにユーザーへ払い戻しを⾏わないといけない 最短で約20分おきにレースが発⾛する できるだけ早く払い戻し処理を完了させた⽅が良い
事業的な要件 • 購⼊リクエスト 1,000 rps を処理 • 3分以内に 30万ユーザーに払い戻し
⾼負荷 購⼊は Spannerのスケールアウトで対応 Spannerとsingleflightで問題なく捌けた
Queue-Based Load Leveling 払い戻しは キューイングしてワーカーで処理
Cloud PubSub GCPのフルマネージド メッセージング ミドルウェア • Topic/Subscription • At least
once 配信 • Ack/Nackでリデリバリー可能
Queue-Based Load Leveling メリット • ワーカーの数を調整することでDB負荷を抑えることができる • スケールアウト‧インが容易 • エラーが発⽣してもNackを返すことでリデリバリーされ⽋損しない
Queue-Based Load Leveling もしキューイングせずに処理すると… • DBなどへの負荷がスパイクして障害につがなるおそれがある • KubernetesはPodの再配置を⾃動的に⾏うので⻑時間の処理中にスケ ジューリングされると処理が中断され⽋損につながるおそれがある •
Podで処理するとそのリソースが性能限界になりスケールしにくい
Queue-Based Load Leveling 負荷試験の結果 • 1秒間に1,000ユーザー分 払い戻しできた → 3分間で18万ユーザーという結果に
Queue-Based Load Leveling 様々な処理で利⽤している • お知らせ送信(メール‧プッシュなど) • ユーザーステージの更新 • ポイント精算
など…
ありがとうございました