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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
200
Flutterとの1年
najeira
4
1.6k
Flutter List View 概要
najeira
0
1.2k
Flutter / Google I/O 2018 報告会 信州
najeira
0
340
仕組みを知れば怖くない! 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
dRuby over BLE
makicamel
2
380
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
710
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
Contextとはなにか
chiroruxx
1
330
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
170
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
RTSPクライアントを自作してみた話
simotin13
0
610
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
210
Inside Stream API
skrb
1
740
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
200
OSもどきOS
arkw
0
570
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
BBQ
matthewcrist
89
10k
Mobile First: as difficult as doing things right
swwweet
225
10k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Paper Plane (Part 1)
katiecoart
PRO
0
9.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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できるのはひとり ⇒オリジンへのアクセスはひとり セマフォ用のキーに有効期限がある ⇒セマフォの解放が非同期で自動 ⇒解放されると次のアクセスが新しい キャッシュを作る