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
Cache Stampede をセマフォで対策する
Search
najeira
September 27, 2016
Programming
19k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cache Stampede をセマフォで対策する
najeira
September 27, 2016
More Decks by najeira
See All by najeira
Flutter with Platform
najeira
4
1.5k
Google I/O 2019 Extended Tokyo - Flutter
najeira
1
210
Flutter APP DOJO 2019-04
najeira
1
210
Flutterとの1年
najeira
4
1.6k
Flutter List View 概要
najeira
0
1.2k
Flutter / Google I/O 2018 報告会 信州
najeira
0
350
仕組みを知れば怖くない! Flutter入門
najeira
16
8.1k
FlutterでAndroid/iOS両対応のアプリ開発
najeira
0
4.7k
Google I/O 2017 報告会 Firebase/Cloud
najeira
1
190
Other Decks in Programming
See All in Programming
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
480
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
560
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
250
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
340
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
530
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
400
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
Google Apps Script で Ruby を動かす
kawahara
0
150
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
190
Featured
See All Featured
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
430
Utilizing Notion as your number one productivity tool
mfonobong
4
530
The untapped power of vector embeddings
frankvandijk
2
1.8k
Faster Mobile Websites
deanohume
310
32k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Making the Leap to Tech Lead
cromwellryan
135
10k
How to Ace a Technical Interview
jacobian
281
24k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
240
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
270
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.3k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Transcript
Cache Stampede 対策として セマフォを使う najeira @ Gunosy Cache Night
Cache Stampede キャッシュの有効期限切れによって オリジン(データベースなど)へ アクセスが殺到する問題 Stampede = 殺到
典型的な使い方 # キャッシュからデータを取得する data = get_cache(key) if not data: #
キャッシュがなければデータベースから取得する data = get_data_from_database(...) # 新しいデータをキャッシュに保存する set_cache(key, data, ttl=60) # ユーザーにレスポンスを返す send_response(data)
アクセスが少ないと
アクセスが多いと
呼び方? 他にも • Cache miss storm • Dog-piling と呼ばれたりするらしい Thundering
Herdと呼ばれることも?
対策 • ロック • 別プロセスで定期更新 • 確率的な期限切れ 今日はロック(セマフォ)について
有名OSSは? • Rails ActiveSupport::Cache::Store race_condition_ttl • nginx proxy_cache_lock • Varnish
Grace mode いずれもロック系の対策
考え方 新しいキャッシュの作成は 「ひとりだけ」が実行すればよい 他のプロセスは、 それを待つか、 古いキャッシュを使う
ひとりだけ更新
セマフォ 並列環境での複数の実行単位が共有す る資源にアクセスするのを制御するもの。 ある資源が何個使用可能かを示す記録 で、使用や解放の際に記録を安全に書き 換え、資源が使用可能になるまで待つ操 作が結びついている。 by https://ja.wikipedia.org/wiki/セマフォ
セマフォ Webサーバは複数台に分散、 同一のサーバでも複数プロセス OSの(プログラミング言語上の) セマフォを使うことはできない。
セマフォ キャッシュが共有資源なので、 キャッシュのシステム上に セマフォを実現すればよい
Memcached Add add: データが存在しない場合のみ 保存する。
コードで見ると data = memcache.get(key_for_data) if not data: memcache.add(key_for_semaphore, 1, ttl=60)
data = get_data_from_database(...) #データベースから取得 memcache.set(key_for_data, data, ttl=120) # キャッシュを保存 else: #セマフォの獲得を試みる ret = memcache.add(key_for_semaphore, 1, ttl=60) if ret: # セマフォを獲得した場合は新しいキャッシュを作る data = get_data_from_database(...) memcache.set(key_for_data, data, ttl=120) return data
ポイント セマフォ用のキーは データ用のキーより 短い有効期限にしておく セマフォ < データ
ポイント addできるのはひとり ⇒オリジンへのアクセスはひとり セマフォ用のキーに有効期限がある ⇒セマフォの解放が非同期で自動 ⇒解放されると次のアクセスが新しい キャッシュを作る