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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
8
4.7k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
620
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
Contextとはなにか
chiroruxx
1
320
A2UI という光を覗いてみる
satohjohn
1
130
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
550
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
170
Oxlintのカスタムルールの現況
syumai
6
1.1k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.6k
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.5k
Featured
See All Featured
Building an army of robots
kneath
306
46k
Bash Introduction
62gerente
615
220k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
The Pragmatic Product Professional
lauravandoore
37
7.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Speed Design
sergeychernyshev
33
1.8k
Google's AI Overviews - The New Search
badams
0
1k
Rails Girls Zürich Keynote
gr2m
96
14k
Navigating Weather and Climate Data
rabernat
0
220
Building AI with AI
inesmontani
PRO
1
1.1k
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できるのはひとり ⇒オリジンへのアクセスはひとり セマフォ用のキーに有効期限がある ⇒セマフォの解放が非同期で自動 ⇒解放されると次のアクセスが新しい キャッシュを作る