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
JaSST 24 九州:ワークショップ(は除く)実践!マインドマップを活用したソフトウェアテスト+活用事例
satohiroyuki
0
260
Vaporモードを大規模サービスに最速導入して学びを共有する
kazukishimamoto
4
4.3k
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する / Go Connect #3
arthur1
10
2.3k
Vue.js学習の振り返り
hiro_xre
2
130
推し活としてのrails new/oshikatsu_ha_iizo
sakahukamaki
3
1.6k
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
3
390
僕がつくった48個のWebサービス達
yusukebe
18
17k
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
7
2.7k
macOS でできる リアルタイム動画像処理
biacco42
3
1.4k
Pinia Colada が実現するスマートな非同期処理
naokihaba
2
150
リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果
katty0324
5
3.5k
Android 15 でアクションバー表示時にステータスバーが白くなってしまう問題
tonionagauzzi
0
130
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
31
6.3k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
Intergalactic Javascript Robots from Outer Space
tanoku
268
27k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Bash Introduction
62gerente
608
210k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
3
370
Adopting Sorbet at Scale
ufuk
73
9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
What's new in Ruby 2.0
geeforr
342
31k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
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