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
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
1.9k
Database Performance for Ruby on Rails Applications
lchin
7
1.2k
Database Performance for Rails Applications
lchin
5
650
How to Survive and thrive as an engineer in a foreign land
lchin
4
1.2k
#eachを使ったら負け
lchin
7
1.6k
ちょっとわかるrack
lchin
10
1.2k
Other Decks in Programming
See All in Programming
デプロイを任されたので、教わった通りにデプロイしたら障害になった件 ~俺のやらかしを越えてゆけ~
techouse
51
32k
Piniaの現状と今後
waka292
5
1.4k
Mastering Dependencies in Kotlin Multiplatform
tomifabian
0
110
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
780
Synchronizationを支える技術
s_shimotori
1
150
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
3
390
レガシーな Android アプリのリアーキテクチャ戦略
oidy
1
170
Progressive Web Apps für Desktop und Mobile mit Angular (Hands-on)
christianliebel
PRO
0
110
カスタムしながら理解するGraphQL Connection
yanagii
1
1.2k
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
200
cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話
phigasui
3
2.2k
Content Security Policy入門 セキュリティ設定と 違反レポートのはじめ方 / Introduction to Content Security Policy Getting Started with Security Configuration and Violation Reporting
uskey512
1
420
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
65
11k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
How GitHub (no longer) Works
holman
311
140k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
We Have a Design System, Now What?
morganepeng
50
7.2k
Designing on Purpose - Digital PM Summit 2013
jponch
115
6.9k
Done Done
chrislema
181
16k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Writing Fast Ruby
sferik
626
60k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.2k
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