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.4k
WinTicketにおける リアルタイム性と高負荷を考慮したアーキテクチャ/WinTicket Architecture
Hiroaki Egashira
October 18, 2019
Tweet
Share
More Decks by Hiroaki Egashira
See All by Hiroaki Egashira
レコメンドへの大規模アクセスを支えるGo製サーバーの裏側
_hiro511
7
3.7k
WinTicketにおけるライブ配信システムの実現
_hiro511
2
820
MicroServices and MonoRepo
_hiro511
2
1.3k
Other Decks in Technology
See All in Technology
Geminiとv0による高速プロトタイピング
shinya337
0
220
KiCadでPad on Viaの基板作ってみた
iotengineer22
0
280
GeminiとNotebookLMによる金融実務の業務革新
abenben
0
250
Flutter向けPDFビューア、pdfrxのpdfium WASM対応について
espresso3389
0
120
Connect 100+を支える技術
kanyamaguc
0
180
Tokyo_reInforce_2025_recap_iam_access_analyzer
hiashisan
0
170
Backlog ユーザー棚卸しRTA、多分これが一番早いと思います
__allllllllez__
1
120
無意味な開発生産性の議論から抜け出すための予兆検知とお金とAI
i35_267
2
10k
OPENLOGI Company Profile for engineer
hr01
1
33k
WordPressから ヘッドレスCMSへ! Storyblokへの移行プロセス
nyata
0
410
Lambda Web Adapterについて自分なりに理解してみた
smt7174
5
150
5min GuardDuty Extended Threat Detection EKS
takakuni
0
180
Featured
See All Featured
Fireside Chat
paigeccino
37
3.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Rails Girls Zürich Keynote
gr2m
94
14k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
500
Facilitating Awesome Meetings
lara
54
6.4k
RailsConf 2023
tenderlove
30
1.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
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 様々な処理で利⽤している • お知らせ送信(メール‧プッシュなど) • ユーザーステージの更新 • ポイント精算
など…
ありがとうございました