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
生鮮ECのタイムセールを 耐え抜いてきた話 / Handling high traffic s...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Leonard Chin
April 08, 2022
Programming
3
12k
生鮮ECのタイムセールを 耐え抜いてきた話 / Handling high traffic sale days at Cookpad Mart
Cookpad Tech Kitchen #26「数千万レコードをリアルタイムに捌く生鮮EC事業開発」の資料
https://cookpad.connpass.com/event/239885/
Leonard Chin
April 08, 2022
Tweet
Share
More Decks by Leonard Chin
See All by Leonard Chin
Performance as a Product Feature
lchin
5
2.1k
Database Performance for Ruby on Rails Applications
lchin
7
1.3k
Database Performance for Rails Applications
lchin
5
740
How to Survive and thrive as an engineer in a foreign land
lchin
4
1.3k
#eachを使ったら負け
lchin
7
1.7k
ちょっとわかるrack
lchin
10
1.3k
Other Decks in Programming
See All in Programming
TipKitTips
ktcryomm
0
160
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
370
Codex の「自走力」を高める
yorifuji
0
1.1k
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
4
380
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
260
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.8k
2026年は Rust 置き換えが流行る! / 20260220-niigata-5min-tech
girigiribauer
0
230
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.6k
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
110
Ruby x Terminal
a_matsuda
7
590
PJのドキュメントを全部Git管理にしたら、一番喜んだのはAIだった
nanaism
0
250
API Platformを活用したPHPによる本格的なWeb API開発 / api-platform-book-intro
ttskch
1
130
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
82
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
320
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
So, you think you're a good person
axbom
PRO
2
1.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Being A Developer After 40
akosma
91
590k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
140
A Soul's Torment
seathinner
5
2.4k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
230
Transcript
© 2022 Cookpad Inc. Cookpad Tech Kitchen #26 2022/3/24 生鮮ECのタイムセールを
耐え抜いてきた話 クックパッド株式会社 Leonard Chin / レオ
© 2022 Cookpad Inc. 2 Leonard Chin (レオ) オーストラリア .au
出身 2012年クックパッド株式会社入社 • 広告事業、海外事業、TV事業、レシピ事業 2020年買い物事業に参画 • バックエンドエンジニア、テックリード • 買物プロダクト開発部ECアプリケーション開発グループ長 Twitter: @lchin GitHub: l15n
生鮮ECクックパッドマートの特徴 © 2022 Cookpad Inc. 3
クックパッドマートでの買物の流れ © 2022 Cookpad Inc. 4 アプリで注文 (ユーザ) 注文日 納品・出荷
(販売者) 出荷日 ステーションへ配達 (流通) 受取日 受け取る (ユーザ) 受取日
© 2022 Cookpad Inc. 5 クックパッドマートアプリでの買物 ステーション(受け取り場所) 受け取り日 カート追加
注文 ステーション(受け取り場所)& 受け取り可能時間
クックパッドマートECの性質からくる制約 • お届け日が購入前に確定 • 販売者のプラットフォームである ◦ 販売者数が多い
◦ 販売者の在庫がそれぞれ管理(日毎) ◦ 営業日(出荷可能日) ◦ 注文の締め切り(締め時間) • 自社流通 ◦ キャパシティに上限がある ▪ ハブ(倉庫) ▪ カーゴ(トラック) ▪ ステーション(冷蔵庫) ◦ 限りあるトラックのルーティング ◦ 受取場所の営業日、営業時間 「この商品、購入できますか?」の判定が複雑 © 2022 Cookpad Inc. 6 どんな商品が買えるのか?の課題
DPは商品の「購入可否状態」を管理するキャッシュ DP数 = 商品数 x お届け日 x 拠点
• 商品数: 1万以上 • お届け日: 1週間分が参照可能 • 拠点数: 数百 → 数千万件の「生きている」レコード © 2022 Cookpad Inc. 7 DeliveryProduct (DP)
タイムセール:施策と試練 © 2022 Cookpad Inc. 8
• 毎週開催 • 時間限定のセール • 特別価格でマ美味しい商品を紹介する • 在庫に限りがある •
一斉プッシュ通知でユーザに知らせる ユーザにも、事業にもメリットが大きい施策 しかし、、、 © 2022 Cookpad Inc. 9 施策:タイムセール
© 2022 Cookpad Inc. 10 タイムセールで何が起きるか(初期/2020年頃) プッシュ通知を 一斉送信 買物客が一気に 押し寄せる
大変
ユーザが殺到し、サーバーがパンク状態になってしまうとせっかくの販売 機会を失ってしまう上、ユーザの信頼まで失ってしまう。 どうすれば、タイムセール中でも快適な買物体験を提供できるか? © 2022
Cookpad Inc. 11 タイムセールの機会損失
Push通知は全ユーザに数分間に届くため、 • 平常時の50-100xのアクセス • 短時間(〜5分間)のにアクセス集中 • アクセスパターンが変わる
◦ 起動画面へのアクセス ◦ 買物行動(カート追加、決済) © 2022 Cookpad Inc. 12 タイムセールの技術的課題
とてもやり甲斐がある 意訳:難しい © 2022 Cookpad Inc. 13 クックパッドマートにおける負荷対策のチャレンジ 📈
受取日 x 拠点の組み合わせで キャッシュが効きにくい 負荷が短時間に集中するため、 サーバ増設すると無駄が多い 成長フェーズですので、データ量も アクセス数が増え続けてる
タイムセールの負荷対策:準備編 © 2022 Cookpad Inc. 14
• Application ◦ Ruby on Rails v6.1, Ruby 3.0 •
Datastores ◦ Amazon Aurora (MySQL 5.7 compat.) ◦ Amazon Elasticache (memcached) ◦ Amazon Redshift ◦ Amazon S3 • Infrastructure ◦ Amazon Web Services © 2022 Cookpad Inc. 15 クックパッドマートの技術スタック(バックエンド)
© 2022 Cookpad Inc. 16 クックパッドマート:ECサービス全体概要 今回の話の中心
• モニタリング ◦ Server metrics ◦ Application Performance Monitoring ◦
Slow query log ◦ etc. • 分析と対策 ◦ 事実の記録して、共有 ◦ 根本原因の分析 ◦ 対策の提案と実施とフォローアップ • 権限と調整 ◦ ソフトウェアの変更 ◦ インフラストラクチャの変更 (DevOps) ◦ 仕様の変更 © 2022 Cookpad Inc. 17 負荷対策に必要なこと
© 2022 Cookpad Inc. 18 モニタリング Scout APM Server Metrics
(Grafana) SLI/SLO (Grafana) Slow Query (Kibana) クックパッドマートでは、それぞれのレイヤーでモニタリングを実現してる。
組織として取り組むために、「決まった場所」「決まった方法」で記録を残して、協力できるようにしてる。対策も記録し、結果をフォローアップして豆に記録して、知見 (グラフの読み方、対策の効果)を貯めている。 © 2022 Cookpad Inc. 19 分析と対策 専用Slackチャンネル
#kaimono-isucon Issueとして記録 レポートテンプレートの 半自動化
対策を実行するために、権限を獲得する必要がある。DevOpsを実践してる組織として、インフラストラクチャはセルフサービス化してる。また、プロダクト組織として も、職能横断チームを構成しているため、仕様変更の交渉も隔たりなく行ってる © 2022 Cookpad Inc. 20 権限と調整
DevOps道具 hako-console Infrastructure as Code (IAM, Terraform) Stream-aligned product teams
タイムセールの負荷対策:実施編 © 2022 Cookpad Inc. 21
© 2022 Cookpad Inc. 22 初期の負荷対策:スケールアップ・スケールアウト(1) 初期症状:unicornワーカー完売 • 全ワーカーが完売
• リクエストキューが1500件以上 対策:AWS scheduled taskで事前にアプリケーションスケールアウト しかし・・・
症状 • 初動はreader CPU 100% • その後はwriter CPU 100%
対策 • readerはスケールアウト ◦ 台数増やす ◦ 都度でも常設でも • writerはスケールアップ ◦ より大きいインスタンス ◦ 常設 © 2022 Cookpad Inc. 23 初期の負荷対策:スケールアップ・スケールアウト(2)
タイムセールのたびに、スケールアウト を実施する体制 Tradeoff: • サーバーコスト vs • エンジニアへの運用負担
正直、なかなか大変でしたが、本質な 対策のための時間稼ぎとして有効 © 2022 Cookpad Inc. 24 初期の負荷対策:スケールアップ・スケールアウト(3) Cost管理 On-Call担当の タイムセール対応 手順化
APMの「Time Consumed」順で対策するendpointを極 める © 2022 Cookpad Inc. 25 中期の負荷対策:パフォーマンス・チューニング(1) 症状
対策 N+1クエリー preload ARメモリー肥大化 pluckする Slow Query index追加、テーブル変更、 join を減らす アプリ計算量 メモ化、キャッシュ活用 飛び道具はなく、地道に取り組んでくだけです。高い効果が期待できるendpointを順に計測して、チューニングしていく。そして、また計測する
本当の飛び道具は「仕様の変更」 • その(遅い)機能は本当に適切なのか? • クライアントはレスポンスを全部使っているのか? • もっと効果的な機能を差し替えないか?
特に進化の早いサービスの場合、1年前に「必要」だと思われた機能は1年後に意味があるのか怪しい。プロダ クトチーム内で無駄を見つけ、議論して、リプレースしていく。 © 2022 Cookpad Inc. 26 後期の負荷対策:仕様変更
Before ホーム画面に全カテゴリから10商品ずつを表示 →しかしカテゴリも商品も10x以上増え、巨大なレスポンスになって、レ スポンス生成も通信も遅い After ホーム画面を見直し、カテゴリ商品の表示を別画面に移す。代わりに特 集コンテンツやユーザ別コンテンツを表示
→結果、パフォーマンスも改善し、使い勝手UP © 2022 Cookpad Inc. 27 後期の負荷対策:仕様変更/事例(1)ホーム画面
疑問 タイムセールの短時間にプッシュ通知を送る必要は本当にあるのか?売上に効果あるのか? 検証 プッシュ通知を開始時刻とずらして、変化はあるのか? → 早く購入したいユーザば予告を見てプッシュ通知に頼らずに訪問することがわかった。プッシュが遅くても、売 上に影響なし 結果 プッシュ通知をスロトリングし、ユーザの起動を分散して負荷を分散してピークを減らした ©
2022 Cookpad Inc. 28 後期の負荷対策:仕様変更/事例(2)プッシュ通知
タイムセールの現状 © 2022 Cookpad Inc. 29
• パフォーマンスSLIはSLOを維持できてい る • on-call担当のスケールアウト、監視が不 要に 🎉 常に快適な買物体験を提供
🎉 bizに施策実施タイミングの制約なし © 2022 Cookpad Inc. 30 平和なタイムセール 対策不要の様子
© 2022 Cookpad Inc. 31