Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Webアプリケーションのキャッシュ戦略とそのパターン / Pattern and Strate...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
moznion
March 04, 2017
Technology
360k
76
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Webアプリケーションのキャッシュ戦略とそのパターン / Pattern and Strategy of Web Application Caching
YAPC::Kansai OSAKA 2017の資料です
moznion
March 04, 2017
More Decks by moznion
See All by moznion
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous Browser Application Performance Monitoring; Act 1
moznion
0
120
reFACToring
moznion
1
1.3k
cccccc
moznion
1
2.6k
履歴テーブル、今回はこう作りました 〜 Delegated Types編 〜 / How We Built Our History Table This Time — With Delegated Types
moznion
16
16k
「データ無い! 腹立つ! 推論する!」から 「データ無い! 腹立つ! データを作る」へ チームでデータを作り、育てられるようにするまで / How can we create, use, and maintain data ourselves?
moznion
11
7.6k
避けられないI/O待ちに対処する: Rails アプリにおけるSSEとasync gemの活用 / Tackling Inevitable I/O Latency in Rails Apps with SSE and the async gem
moznion
4
9.5k
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
470
地に足の付いた現実的な技術選定から魔力のある体験を得る『AIレシート読み取り機能』のケーススタディ / From Grounded Tech Choices to Magical UX: A Case Study of AI Receipt Scanning
moznion
7
5.2k
Chrome Extension Techniques from Hell
moznion
1
330
Other Decks in Technology
See All in Technology
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
0
140
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
2
460
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
510
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
130
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
130
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
0
140
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
740
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
2
550
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
150
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
1
170
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
1
2.8k
Featured
See All Featured
Design in an AI World
tapps
1
320
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
Fireside Chat
paigeccino
43
4k
Making Projects Easy
brettharned
120
6.8k
Between Models and Reality
mayunak
4
460
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
510
Designing for Performance
lara
611
70k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
Transcript
WebΞϓϦέʔγϣϯͷ Ωϟογϡઓུͱ ͦͷύλʔϯ @moznion
None
໔ ੈͷத৭ʑͳέʔε͕͋Γ·͔͢Β શͯΛΧόʔ͢Δ༰ແཧͰͨ͠ ͜ͷ༰҃ΔҰྫͩͱࢥͬͯ ϦϥοΫεͯ͠ோΊ͍ͯͩ͘͞
@moznion Web application server side engineer Twitter: @moznion GitHub: moznion
Ωϟογϡ
ࠓճ͢͜ͱ - WebΞϓϦέʔγϣϯʹ͓͚ΔΩϟογϡʹ͍ͭͯ - HTTPϨΠϠͰͷΩϟογϡ - ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ - ΩϟογϡΛΊΑ͏
લఏ: ߴͳ (Web) ΞϓϦέʔγϣϯΛ ߏஙɾӡ༻͍ͯ͘͠ඞཁ͕͋Δ
Ωϟογϡͱͳʹ͔ʁ
Ωϟογϡʁ ʮΩϟογϡ: ΛӅͨ͠Γ֨ೲͨ͠Γ͓ͯ͘͠ͷʹ҆શͳॴʯ ― Webster ৽ੈքถޠࣙయɼΧϨοδ൛ ୈ3൛ ʮΩϟογϡͱௐΔඞཁͷ͋ΔͷΛஔ͍͓ͯ҆͘શͳॴͷ ͜ͱͰ͋ΔɽΩϟογϡͱ͍͏༻ޠɼ࠷ॳͷ༻ίϯϐϡʔλʹ ͓͍ͯɼϓϩηοαͱओهԱͱͷؒʹૠೖ͞ΕͨهԱ֊ϨϕϧΛ
දͨ͢Ίʹ༻͞Εͨɽ(தུ) ͜ͷ༻ޠࠓͰࢀরͷہॴੑΛ ར༻͢ΔΑ͏ʹཧ͞ΕͨҙͷهԱΛࢦͯ͠༻͞ΕΔʯ ― σΠϏου A ύλʔιϯ, δϣϯ ̡ ϔωγʔ ஶ, ా ޫজ ༁ ίϯϐϡʔλͷߏͱઃܭɼୈ5൛ [Լ] ❞ ❞
ͳΔ΄Ͳ…
લఏ: ߴͳ (Web) ΞϓϦέʔγϣϯΛ ߏஙɾӡ༻͍ͯ͘͠ඞཁ͕͋Δ
લఏ: ߴͳ (Web) ΞϓϦέʔγϣϯΛ ߏஙɾӡ༻͍ͯ͘͠ඞཁ͕͋Δ
Ωϟογϡʁ ʮΩϟογϡ: ΛӅͨ͠Γ֨ೲͨ͠Γ͓ͯ͘͠ͷʹ҆શͳॴʯ ― Webster ৽ੈքถޠࣙయɼΧϨοδ൛ ୈ3൛ ʮΩϟογϡͱௐΔඞཁͷ͋ΔͷΛஔ͍͓ͯ҆͘શͳॴͷ ͜ͱͰ͋ΔɽΩϟογϡͱ͍͏༻ޠɼ࠷ॳͷ༻ίϯϐϡʔλʹ ͓͍ͯɼϓϩηοαͱओهԱͱͷؒʹૠೖ͞ΕͨهԱ֊ϨϕϧΛ
දͨ͢Ίʹ༻͞Εͨɽ(தུ) ͜ͷ༻ޠࠓͰࢀরͷہॴੑΛ ར༻͢ΔΑ͏ʹཧ͞ΕͨҙͷهԱΛࢦͯ͠༻͞ΕΔʯ ― σΠϏου A ύλʔιϯ, δϣϯ ̡ ϔωγʔ ஶ, ా ޫজ ༁ ίϯϐϡʔλͷߏͱઃܭɼୈ5൛ [Լ] ❞ ❞
Ωϟογϡʁ ʮΩϟογϡ: ΛӅͨ͠Γ֨ೲͨ͠Γ͓ͯ͘͠ͷʹ҆શͳॴʯ ― Webster ৽ੈքถޠࣙయɼΧϨοδ൛ ୈ3൛ ʮΩϟογϡͱௐΔඞཁͷ͋ΔͷΛஔ͍͓ͯ҆͘શͳॴͷ ͜ͱͰ͋ΔɽΩϟογϡͱ͍͏༻ޠɼ࠷ॳͷ༻ίϯϐϡʔλʹ ͓͍ͯɼϓϩηοαͱओهԱͱͷؒʹૠೖ͞ΕͨهԱ֊ϨϕϧΛ
දͨ͢Ίʹ༻͞Εͨɽ(தུ) ͜ͷ༻ޠࠓͰࢀরͷہॴੑΛ ར༻͢ΔΑ͏ʹཧ͞ΕͨҙͷهԱΛࢦͯ͠༻͞ΕΔʯ ― σΠϏου A ύλʔιϯ, δϣϯ ̡ ϔωγʔ ஶ, ా ޫজ ༁ ίϯϐϡʔλͷߏͱઃܭɼୈ5൛ [Լ] ❞ ❞ جຊతͳ֓೦ͱͯͦ͠ͷ௨Γ Ͱ͜Εϓϩηοαͷͩʂ
ࠓճ͞ͳ͍͜ͱ - WebΞϓϦέʔγϣϯҎ֎ͷΩϟογϡʹ͍ͭͯ - e.g - ϓϩηοαͷΩϟογϡ - DNSΩϟογϡʹ͍ͭͯࠓճ͠·ͤΜ -
ଞʹ৭ʑͳΛ͠·ͤΜ
WebΞϓϦέʔγϣϯʹ͓͚Δ Ωϟογϡͱͳʹ͔ʁ
WebΞϓϦέʔγϣϯʹ͓͚ΔΩϟογϡʁ αʔό͕ฦ͖͢ίϯςϯπʹ͍ͭͯ…… - 1࣍ετϨʔδΑΓߴͳετϨʔδʹ ஔ͓͍͔ͯͯͦ͜͠Βฦ͢ - ͘͠ฦ͞ͳ͍
WebΞϓϦέʔγϣϯʹ͓͚ΔΩϟογϡʁ ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ ߴͳετϨʔδܦ༝Ͱฦ͢ํ HTTPϨΠϠͰͷΩϟογϡ ϨεϙϯεΛฦ͞ͳ͍ํ
WebΞϓϦέʔγϣϯʹ͓͚ΔΩϟογϡʁ ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ ߴͳετϨʔδܦ༝Ͱฦ͢ํ HTTPϨΠϠͰͷΩϟογϡ ϨεϙϯεΛฦ͞ͳ͍ํ
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage Heavy Component OR
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage i ii iii iv i.
ϦΫΤετ ii. Ұ࣍ετϨʔδ͍߹Θͤ iii. ݁ՌΛฦ͢ iv. Ϩεϙϯε
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage i ii iii iv i.
ϦΫΤετ ii. Ұ࣍ετϨʔδ͍߹Θͤ iii. ݁ՌΛฦ͢ iv. Ϩεϙϯε ͕͜͜ωοΫ ͷ߹
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage ii iii Cache Storage
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage i ii iii iv i.
ϦΫΤετ ii. Ωϟογϡ͍߹Θͤ iii. ݁ՌΛฦ͢ iv. Ϩεϙϯε Cache Storage ii iii
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage i ii iii iv i.
ϦΫΤετ ii. Ωϟογϡ͍߹Θͤ iii. ݁ՌΛฦ͢ iv. Ϩεϙϯε Cache Storage ii iii Ұ࣍ετϨʔδΑΓ Ωϟγϡ͕ߴͳΒ ૣ͘ฦͤΔ
ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ Server Client Primary Storage ii iii Ұ࣍ετϨʔδͱ ΩϟογϡετϨʔδ ͳΜΒ͔༰ͷ߹Λ
औΔඞཁ͕͋Δ Cache Storage
WebΞϓϦέʔγϣϯʹ͓͚ΔΩϟογϡʁ ΞϓϦέʔγϣϯϨΠϠͰͷΩϟογϡ ߴͳετϨʔδܦ༝Ͱฦ͢ํ HTTPϨΠϠͰͷΩϟογϡ ϨεϙϯεΛฦ͞ͳ͍ํ
HTTPϨΠϠͰͷΩϟογϡ ΩϟογϡͱɺϦιʔεͷʹج͍ͮͯɺҰऔಘͨ͠Ϧιʔ εΛΫϥΠΞϯτଆͰ͍·Θ͢ํࣜͰ͢ɻ ΩϟογϡͷརɺαʔόͱΫϥΠΞϯτؒͷ௨৴ΛݮΒ͢͜ͱ ͰωοτϫʔΫଳҬͷར༻ॲཧ࣌ؒΛॖখ͠ɺΑΓޮతʹॲཧ Ͱ͖Δ͜ͱͰ͢ɻ ― ࢁຊ ཅฏ ஶ
WebΛࢧ͑Δٕज़ - HTTPɺURIɺHTMLɺͦͯ͠REST (WEB+DB PRESS plus) ❞
HTTPϨΠϠͰͷΩϟογϡ Server Client contents
HTTPϨΠϠͰͷΩϟογϡ Server Client i ii i. ίϯςϯπ͘Εʙ ii. ͍Αʙ contents
HTTPϨΠϠͰͷΩϟογϡ Server Client i ii i. ίϯςϯπ͘Εʙ ii. ͍Αʙ contents
ίϯςϯπ͕ωοτϫʔΫʹΔ (serverͷཪଆͰߋʹॏ͍ॲཧ͕͍ͬͯΔ͔) contents
HTTPϨΠϠͰͷΩϟογϡ Server Client contents contents ΫϥΠΞϯτଆͰίϯςϯπΛอ࣋
HTTPϨΠϠͰͷΩϟογϡ Server Client contents contents i ii i. ίϯςϯπ͘Εʙ ii.
͏࣋ͬͯ·͢Α
HTTPϨΠϠͰͷΩϟογϡ Server Client contents contents i ii i. ίϯςϯπ͘Εʙ ii.
͏࣋ͬͯ·͢Α ίϯςϯπωοτϫʔΫʹΒͳ͍ ʮ͏࣋ͬͯ·͢Αʯͱ͍͏ใ͕Δ
HTTPϨΠϠͰͷΩϟογϡ ͨͩ͠ɺݹ͍ΩϟογϡΛར༻ͯ͠͠·͍ɺใͷ৴པੑ͕Լ͕Δ Մೳੑ͋Γ·͢ɻ ― ࢁຊ ཅฏ ஶ WebΛࢧ͑Δٕज़ - HTTPɺURIɺHTMLɺͦͯ͠REST
(WEB+DB PRESS plus) ❞
ࠓճओʹΞϓϦέʔγϣϯϨΠϠͷ Ωϟογϡͷ͕ଟ͍Ͱ͢ (HTTPϨΠϠͷͰڞ௨͢Δ͋Γ·͢)
ͳͥΩϟογϡΛ͏ͷ͔ʁ
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ)
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ)
ϦΫΤετΛߴʹฦ٫͢Δ Server Client Cache Storage ߴʹฦ٫͢Δ͜ͱͰ ετϨε͕গͳ͘ͳΓ ϢʔβʔମݧΞοϓʂ ⚡⚡⚡
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ)
୯Ґ࣌ؒ͋ͨΓͷॲཧͷ૿Ճ Server Client Cache Storage ୯Ґ࣌ؒ͋ͨΓͷॲཧ ૿ՃʹΑΓҰʹ ͨ͘͞ΜͷϦΫΤετΛ ͚͞Δ Client
Client . . .
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ)
ಛఆίϯϙʔωϯτͷෛՙܰݮ Server Client Client . . . Storage (৭ʑͳࣄ͕͋Γ) ετϨʔδʹෛՙ͕ूத͍ͯ͠Δʂ
ಛఆίϯϙʔωϯτͷෛՙܰݮ Server Client Client . . . Storage Cache Storage
ಛఆίϯϙʔωϯτͷෛՙܰݮ Server Client Client . . . Storage Cache Storage
Ωϟογϡʹಀ͕ͯ͠ Δ͜ͱͰ աෛՙίϯϙʔωϯτͷ ෛՙΛܰݮ͢Δ
ಛఆίϯϙʔωϯτͷෛՙܰݮ Server Client Client . . . Storage Cache Storage
͔͠͠Ωϟογϡίϯϙʔωϯτ͕ ૿͑Δ͜ͱͰγεςϜͱͯ͠ͷ ނোՄೳੑ૿Ճ͢Δʂ
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ)
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ) ͭ·ΓΧωʂʂʂ
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ) ͭ·ΓΧωʂʂʂ
ͳͥΩϟογϡΛ͏ͷ͔ʁ ϦΫΤετΛߴʹฦ٫͢ΔͨΊ Ϣʔβମݧͷ্ ୯Ґ࣌ؒ͋ͨΓͷॲཧΛ૿Ճͤ͞ΔͨΊ ܭࢉػϦιʔεͷར༻ޮ্ঢ ɹɹRequest per secondͷ૿Ճ ಛఆίϯϙʔωϯτ (e.g.
RDBMS) ͷෛՙݮͷͨΊ γεςϜͷ҆ఆӡ༻ (͔͠͠߹ʹґΔ) ͭ·ΓΧωʂʂʂ Ωϟογϡ͔ʂʁ
͍
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query.
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query..
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query…
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query…
͜͜ͰαʔϏε͕٧·Δ (աෛՙͰDB͕μϯ͢Δ͔ʁ)
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Cache
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Cache Ωϟογϡʹಀ͕͢͜ͱͰ
ݱ࣮తͳ࣌ؒͰฦ͢ (ෛՙࢄͤ͞Δ)
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Not slow request
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Not slow request!!!!!!
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Not slow request!!!!!! ܾ͍ͯ͠ϦΫΤετͰͳ͍͕
ϦΫΤετ͕ଟ͗ͯ͢ࡹ͖͖Εͳ͍
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Cache
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Cache ͬͱߴͳετϨʔδͰ ରԠͯ͠ͳΜͱ͔͢Δ (ྗ)
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Cache
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Cache ͦͦωοτϫʔΫͰ ٧·ΔՄೳੑ͕͋Δ
ৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ Server . . . Storage Cache HTTPϨΠϠͷΩϟογϡΛͬͯ ʮฦ͞ͳ͍ʯඞཁ͕͋Δ͔
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
֎෦αʔϏεʹґଘ͍ͯ͠Δ Server Client Client . . . Outer Service Request
(via HTTP)
֎෦αʔϏεʹґଘ͍ͯ͠Δ Server Client Client . . . Outer Service Request
(via HTTP) ֎෦αʔϏεʹϦΫΤετΛ ඈ͍͍ͯͯ͠
֎෦αʔϏεʹґଘ͍ͯ͠Δ Server Client Client . . . Outer Service Cache
֎෦αʔϏεʹґଘ͍ͯ͠Δ Server Client Client . . . Outer Service Cache
ΩϟογϡΛհ͢Δ͜ͱͰ ߴʹ݁ՌΛಘΔͱͱʹ ෆཁͳϦΫΤετΛݮ͢Δ
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
৭ʑͳ͜ͱ͕͋Δɼ৭ʑͳ͜ͱ͕……
ΩϟογϡΛͲͷΑ͏ͳ࣌ʹ͏͔ - Ͳ͏ͬͯΫΤϦ͕͍ (৭ʑͳ͜ͱ͕͋Δ) - ৭ʑͳཧ༝ͰৗيΛҳͨ͠ྔͷΞΫηε͕͋Δ - ৭ʑ͋ͬͯ֎෦αʔϏεʹґଘ͍ͯ͠Δ - ͳͲͳͲ
৭ʑͳ͜ͱ͕͋Δɼ৭ʑͳ͜ͱ͕…… ͔͠͠ຊʹΩϟογϡ͕ඞཁͳͷ͔ख़ߟ͖͢ɽޙड़
ΩϟογϡετϨʔδ
ΩϟογϡετϨʔδ֓؍ - memcached - memcachedϓϩτίϧΛΔؒ - Redis - BerkeleyDB -
mmap (!) - ΞϓϦͷϓϩηεʹ࣋ͭ - ͳͲͳͲ
ͦͷଞͷΩϟογϡϛυϧΣΞ
ΩϟογϡϛυϧΣΞ֓؍ - Squid - Varnish - ͳͲͳͲ
ΩϟογϡϛυϧΣΞ֓؍ - Squid - Varnish - ͳͲͳͲ HTTPϨΠϠͰͷΩϟογϡΛओʹߦ͏ܥ
ϛυϧΣΞબఆͷ ࣌ؒ༨ͬͨΒΓ·͢
Ωϟογϡઓུ
Ωϟογϡઓུ
Ωϟογϡઓུ ͱʹ͔͘ߴʹฦ͢
Ωϟογϡઓུ ͱʹ͔͘ߴʹฦ͢ ߴʹฦ[ͤ͞]ͳ͍Ωϟογϡແҙຯ
Ωϟογϡઓུ ΞϓϦΛյ͞ͳ͍
Ωϟογϡઓུ ΞϓϦΛյ͞ͳ͍ ΞϓϦΛͿͬյ͢Ωϟογϡແҙຯ
Ωϟογϡઓུ - ߴʹฦ͢ - ΞϓϦΛͿͬյ͞ͳ͍ - ґଘίϯϙʔωϯτΛগͳ͘อͭ - লϝϞϦ -
Ωϟογϡ͕ͿͬյΕͯٽ͔ͳ͍ - (ͳΔۚ͘Λ͔͚ͳ͍)
Ωϟογϡઓུ - ߴʹฦ͢ - ΞϓϦΛͿͬյ͞ͳ͍ - ґଘίϯϙʔωϯτΛগͳ͘อͭ - লϝϞϦ -
Ωϟογϡ͕ͿͬյΕͯٽ͔ͳ͍ - (ͳΔۚ͘Λ͔͚ͳ͍)
ґଘίϯϙʔωϯτΛগͳ͘อͭ - ґଘίϯϙʔωϯτ͕૿͑Δ = ো͕૿͑Δ - োগͳ͍ํ͕ྑ͍ - ҆қʹϛυϧΣΞΛ૿͞ͳ͍ -
ʮͬͯΈ͔͔ͨͬͨΒʯΛؾܰʹΔͱ ͲΜͲΜट͕క·Δ
Ωϟογϡઓུ - ߴʹฦ͢ - ΞϓϦΛͿͬյ͞ͳ͍ - ґଘίϯϙʔωϯτΛগͳ͘อͭ - লϝϞϦ -
Ωϟογϡ͕ͿͬյΕͯٽ͔ͳ͍ - (ͳΔۚ͘Λ͔͚ͳ͍)
লϝϞϦ - ϝϞϦΛϞϦϞϦ৯͏ઃܭΛආ͚Δ - ࠷ॳྑ͍͔͠Εͳ͍͕͋Δಥવ ো͕ى͖ͨΓ͢Δ - (ࢹ͠Ζͱ͍͏Ͱ͋Δ͕……) - جຊతʹΩϟογϡ͢ΔΞΠςϜʹ
ExpireΛ͚Δ (= ӬଓతʹσʔλΛ࣋ͨͳ͍)
Ωϟογϡઓུ - ߴʹฦ͢ - ΞϓϦΛͿͬյ͞ͳ͍ - ґଘίϯϙʔωϯτΛগͳ͘อͭ - লϝϞϦ -
Ωϟογϡ͕ͿͬյΕͯٽ͔ͳ͍ - (ͳΔۚ͘Λ͔͚ͳ͍)
Ωϟογϡ͕ͿͬյΕͯٽ͔ͳ͍ - ΩϟογϡյΕΔͷͱͯ͠ӡ༻ͨ͠΄͏͕ͤ - Ωϟογϡ͕ͿͬյΕͨΒ·ͨ࡞Εྑ͍ - Let it crash -
ͨͩɼͿͬյΕͨλΠϛϯάͰٸܹʹෛՙ্͕͕Δ Α͏ͳঢ়گʹ͚ͩͳΒͳ͍Α͏͖͢
Ωϟογϡઓུ - ߴʹฦ͢ - ΞϓϦΛͿͬյ͞ͳ͍ - ґଘίϯϙʔωϯτΛগͳ͘อͭ - লϝϞϦ -
Ωϟογϡ͕ͿͬյΕͯٽ͔ͳ͍ - (ͳΔۚ͘Λ͔͚ͳ͍)
ͳΔۚ͘Λ͔͚ͳ͍ - ͍
Ωϟογϡύλʔϯ
ύλʔϯʁ ʮͦΕͧΕͷύλʔϯզʑͷͷ·ΘΓͰԿճى͖Δɺ͓ ΑͼɺͦΕͧΕͷʹର͢Δղ๏ͷϙΠϯτΛهड़͍ͯ͠Δɻͦ ͜Ͱզʑɺ͜ΕΒͷղ๏ΛԿສճͰ͏͜ͱ͕Ͱ͖Δɻಉ͡ ʹର͢Δಉ͡ղ๏ΛԿԿ࠷ॳ͔Βߟ͑ͣ͞ʹࡁΉͱ͍ ͏Θ͚ͩʯ ― Erich Gamma, Richard
Helm, Ralph Johnson, John Vlissides ஶ, ຊҐా ਅҰ, ٢ాथ ༁ σβΠϯύλʔϯɼվగ൛ ❞
ύλʔϯԽ͢Δརͱ ʮύλʔϯʹ໊લΛ͚Δ͜ͱͰɺઃܭͷ͓͚Δ༻ޠͷޠኮΛ૿ ͢͜ͱʹͳΔɻͦΕʹΑͬͯߴ͍நϨϕϧͰઃܭ͢Δ͜ͱ͕Մೳ ͱͳΔɻύλʔϯʹؔ͢Δޠኮ͕૿͑Εɺಉ྅ͱٞͨ͠Γɺจ ॻʹهͨ͠ΓɺࣗࣗͰߟ͑Λཧ͢Δͷʹཱͭɻઃܭʹ ؔͯ͠ݕ౼ͨ͠Γɺઃܭ্ͷτϨʔυΦϑΛਓʹ͑Δ͜ͱ༰қ ʹͳΔʯ ― Erich Gamma,
Richard Helm, Ralph Johnson, John Vlissides ஶ, ຊҐా ਅҰ, ٢ాथ ༁ σβΠϯύλʔϯɼվగ൛ ❞
ύλʔϯԽ͢Δརͱ ʮҰ໊લΛݺͿ͜ͱ͕Ͱ͖Εɺ͋ͳͨͦΕΛҙࣝ͠ɺͦΕΛ ࢧ͠ɺͦΕΛॴ༗͠ɺͦΕΛίϯτϩʔϧͰ͖ΔΑ͏ʹͳΔͷͰ ͢ʯ ― Robin Williams ஶ, ٢యल ༁ɹ
ϊϯσβΠφʔζɾσβΠϯϒοΫ ❞
Ωϟογϡͷύλʔϯ - Ωϟογϡʹ͍ͭͯͷύλʔϯɼΈ͍ͨͳΛ͋·Γ ฉ͔ͳ͍ - ݁Ռͱͯ͠ʮ✕✕✕͕˓˓˓Ͱ˚˚˚ʹͳΔͭͰ͢ʯ Έ͍ͨͳৄࡉͳจষͰίϛϡχέʔγϣϯ͢Δ͜ͱ ʹͳΔ => ͨΔ͍
Ωϟογϡͷύλʔϯ - ͱ͍͏Θ͚ͰύλʔϯͰ͢ʂʂ - উखʹ໊͚ͨલͳΜͰ͏طʹผͷ໊લ͕͋Δ͔
(ݸਓతʹ) Α͘͏ ύλʔϯΛ͝հʂ
Brokerύλʔϯ - Ωϟογϡʹ͋ͬͨΒΩϟογϡ͔Βฦ͢ - Ωϟογϡʹແ͔ͬͨΒҰ࣍ετϨʔδʹ͍߹Θ ͤͯͦͷ݁ՌΛฦͭͭ͠ΩϟογϡʹೖΕΔ ϦΫΤετͯ͠…… ϦϙδτϦύλʔϯͷѥछͱݴ͑ͦ͏
Server Client Primary Storage ii iii Cache Storage Brokerύλʔϯ i
ii iii iv i. ϦΫΤετ ii. Ωϟογϡ͍߹Θͤ iii. ώοτͨ͠ͷͰ݁ՌΛฦ͢ iv. Ϩεϙϯε
Server Client Primary Storage ii iii Cache Storage Brokerύλʔϯ i
ii iii iv v vi i. ϦΫΤετ ii. Ωϟογϡ͍߹Θͤ iii. Ωϟογϡʹແ͍ͷͰ Ұ࣍ετϨʔδ͍߹Θͤ iv. ݁ՌΛΩϟογϡʹೖΕΔ v. ݁ՌΛฦ͢ vi. Ϩεϙϯε
Brokerύλʔϯ Pros - ΞΫηεසͷߴ͍ίϯςϯπΩϟογϡʹΓ ͍ίϯςϯπΩϟογϡʹΒͳ͍ লϝϞϦ - σʔλͷ߹ੑΛอ͍ͪ͢ (Ωϟογϡ͕৽) Cons
- ࠷ॳʹίϯςϯπʹདྷͨਓ͕ॏ͘ͳΔ - Ωϟογϡʹ͍ͬͯͳ͍࣌ʹେྔʹΞΫηε͕དྷΔͱ ෳͷϦΫΤετ͕Ұ࣍ετϨʔδʹૹΒΕΔ Cache Thundering Herd (ޙड़)
Inventoryύλʔϯ - Ωϟογϡʹ͋ͬͨΒΩϟογϡ͔Βฦ͢ - Ωϟογϡʹແ͔ͬͨΒσϑΥϧτΛฦͭͭ͠ɼ ඇಉظͰҰ࣍ετϨʔδ͔ΒΛऔ͖ͬͯͯ Ωϟογϡ͢ΔΑ͏ʹ͢Δ ϦΫΤετͯ͠……
Inventoryύλʔϯ Server Client Primary Storage ii iii Cache Storage i
ii iii iv i. ϦΫΤετ ii. Ωϟογϡ͍߹Θͤ iii. ώοτͨ͠ͷͰ݁ՌΛฦ͢ iv. Ϩεϙϯε
Inventoryύλʔϯ Server Client Primary Storage ii iii Cache Storage i
ii iii iv i. ϦΫΤετ ii. Ωϟογϡ͍߹Θͤ iii. Ωϟογϡʹແ͍ iv. σϑΥϧτΛฦ͢ (ඇಉظͰ) iv’. Ұ࣍ετϨʔδ͍߹Θͤ v’. ݁ՌΛΩϟογϡ iv’ v’
Inventoryύλʔϯ Pros - Brokerύλʔϯͱ΄΅ಉ͡Pros͕͋Δ - ࠷ॳʹίϯςϯπʹདྷͨਓʹରͯ͠ϨεϙϯελΠϜ͕ѱԽ ͠ͳ͍ Cons - ࠷ॳʹίϯςϯπʹདྷͨਓ͕ਖ਼͍͠ίϯςϯπΛऔΕͳ͍
- σϑΥϧτͷϋϯυϦϯάΛͲ͏͢Δ͔ - Cache Thundering Herd ʹ͍ͭͯղܾ͍ͯ͠ͳ͍
Warmerύλʔϯ - ͦͷίϯςϯπΛΩϟογϡʹͤΔ - ΫϥΠΞϯτͦͷΩϟογϡΛࢀর͢Δ ίϯςϯπੜ࣌ʹ…… ϥϯΩϯάͱ͔ʹ͑Δ
Warmerύλʔϯ Server Client Cache Storage i ii iii iv contents
contents v i. ίϯςϯπੜ࣌ʹ ίϯςϯπΛΩϟογϡ ii. ϦΫΤετ iii. Ωϟογϡ͍߹Θͤ iv. ίϯςϯπฦ͢ v. Ϩεϙϯε
Warmerύλʔϯ Pros - ࠷ॳ͔ΒΩϟογϡܦ༝ͰίϯςϯπΛฦͤΔ - Cache Thundering Herd ͷҰղܾ Cons
- ίϯςϯπ͕ੜ͞ΕΔܥ͡Όͳ͍ͱ͑ͳ͍ - ϥΠϑαΠΫϧͷཧ͕ࡶʹͳΔ (ಉظͱ͔) - ϝϞϦΊͬͪΌ৯͏߹͕͋Δ - Ωϟογϡ͕شൃͨ࣌͠ʹͲ͏͢Δͷ͔ʁ
Pool & Flushύλʔϯ POSTϦΫΤετܥʹ͏ɽ ϦΫΤετ͕དྷͨ࣌ʹΩϟογϡʹͦͷ༰ΛཷΊɼ ͋ΔλΠϛϯάͰӬଓετϨʔδʹॻ͖ग़͢
Pool & Flushύλʔϯ Server Client Primary Storage ii iii Cache
Storage i ii iii i. ϦΫΤετ ii. ΩϟογϡʹཷΊΔ iii. Ϩεϙϯε (͋ΔλΠϛϯάͰ) x. ӬଓετϨʔδʹॻ͖ग़͠ x
Pool & Flushύλʔϯ Pros - ߴʹߋ৽ܥΛॲཧͰ͖Δ Cons - ϓʔϧ͕ͿͬյΕͨ࣌ʹσʔλ͕ফ໓͢Δ -
σʔλͷҰ؏ੑΛอͭ࿑ྗ͕͔͔Δ
ΫϥΠΞϯταΠυΩϟογϡ
HTTP HeaderΛ༻͍ͨΩϟογϡ Server Client i ii i. ϦΫΤετ ii. ϔομ͚ͯฦ͢
- Expires - Cache-Control - Last-Modified - ETag contents
HTTP HeaderΛ༻͍ͨΩϟογϡ Server Client i ii i. ݅ͷϔομ͚ͯ ϦΫΤετ -
If-Modified-Since - If-None-Match ii. ݅ʹैͬͯฦ͢ contents contents
HTTP HeaderΛ༻͍ͨΩϟογϡ Server Client i ii i. ݅ͷϔομ͚ͯ ϦΫΤετ -
If-Modified-Since - If-None-Match ii. ݅ʹैͬͯฦ͢ contents contents ແବʹίϯςϯπΛฦ͢ඞཁ͕ແ͘ͳΔ
ϩʔΧϧͷڥͰ݁ͤ͞Δ - ΩϟογϡͲ͜ΖͰͳ͍ - ྫ: - ӾཡཤྺΛΫϥΠΞϯτͰ࣋ͬͯΒ͏ - λΠϜϥΠϯ࣮ΛΫϥΠΞϯτͷετϨʔδʹ ࣋ͬͯΒ͏
αʔό͔Βฦ͞ͳ͍ͷ͕ ݁ہ͍ͪΜʂʂʂ
Ωϟογϡʹ·ͭΘΔॾ
Cache Thundering Herd ௨ৗɺΩϟογϡʹ֨ೲ͞ΕΔσʔλɺͦΕͧΕ୯Ұͷੜଘ࣌ؒ Λ͍ͬͯ·͢ɻɺසൟʹΞΫηε͞ΕΔΩϟογϡσʔλ ͕ΤΫεύΠΞͨ͠ࡍʹൃੜ͠·͢ɻσʔλ͕ΤΫεύΠϠͨ͠ॠؒ ͔ΒɺฒߦʹΔෳͷΞϓϦέʔγϣϯϩδοΫ͕ϛεώοτΛ ݕ͠ɺ͍ͣΕ͔ͷϓϩηε͕ΩϟογϡσʔλΛ֨ೲ͢Δ·Ͱͷ ؒɺಉҰͷϦΫΤετ͕ଟɺόοΫΤϯυʹඈΜͰ͠·͏ͷͰ͢ɻ ―ΩϟογϡγεςϜͷ
Thundering Herd (Kazuho@Cybozu Labs) http://labs.cybozu.co.jp/blog/kazuho/archives/2007/09/cache_and_thundering_herd.php ❞
Cache Thundering Herd - ΤϯτϦ͝ͱʹExpireͷपظΛόϥ͢ͱ͔ - ಉҰ༰ͷΤϯτϦΛ2ॏʹ༻ҙ͓͍ͯͯ͠ɼ ͲͪΒ͔ҰํΛૣ͘ (͘͘͠) Expireͤ͞Δͱ͔
ͦ͏͍͏ରࡦɾ͕ඞཁͱͳΔ
ಉظ Ωϟογϡͷ༰ͱӬଓετϨʔδͷ༰ͷ ಉظͲ͏͢ΔΜ͡Ό
ಉظ - ΞϓϦέʔγϣϯجຊతʹӬଓετϨʔδʹର ͯ͠ߋ৽ΛՃ͍͑ͯ͘ Ωϟογϡ࣮ݹ͍ίϯςϯπ͔ - ͪΌΜͱ༰Λಉظͤ͞Α͏ͱ͢Δͱେม - Ωϟογϡ͕ਧ͖ඈͿͱӬଓԽ͞Εͳ͍ɼ ͳΜ͍ͯ͏͋Γ͑Δ
ಉظ ORMΛͬͯDBͱΩϟογϡΛಁաతʹѻ͏ͱ͍͏ ख๏͕͋Δʹ͋Δ͕ࠈײ
ಉظ ࣃΛ৯͍ͬͯ͠Δ͔͠ͳ͍ͷ͔……
ෆ۩߹ى͖ͨͱ͖ͷσόοά͕͠ʹ͍͘ ʮ͋Εɼ͜ΕΩϟογϡͨͬͯΔΜͰ͔͢ʯ ʮ͍ɼDB͔Βऔ͖ͬͯͯΔΜ͡Όͳ͍ʯ ʮͳΜ͔͕ͣΕͯΔΜͰ͢ΑͶʯ ʮΤοɼ͜ΕͲ͏ͳͬͯΜͩʁʯ
ෆ۩߹ى͖ͨͱ͖ͷσόοά͕͠ʹ͍͘ ʮ͋Εɼ͜ΕΩϟογϡͨͬͯΔΜͰ͔͢ʯ ʮ͍ɼDB͔Βऔ͖ͬͯͯΔΜ͡Όͳ͍ʯ ʮͳΜ͔͕ͣΕͯΔΜͰ͢ΑͶʯ ʮΤοɼ͜ΕͲ͏ͳͬͯΜͩʁʯ ͋Γ͕ͪʂʂʂʂʂʂ
ෆ۩߹ى͖ͨͱ͖ͷσόοά͕͠ʹ͍͘ ͜Ε͔ͬΓΔ͔͠ͳ͍……
ෆ۩߹ى͖ͨͱ͖ͷσόοά͕͠ʹ͍͘ օ͞ΜͦΕͧΕͷmemcachedͷҝͷπʔϧ RedisͷҝͷπʔϧΛ͍࣋ͬͯΔ͜ͱͰ͠ΐ͏ (͋Δ͍ϓϩτίϧΛΕΔΑ͏ʹਐԽ͢Δ)
ෆ۩߹ى͖ͨͱ͖ͷσόοά͕͠ʹ͍͘ ͋ͱϩάΛϞϦϞϦࠐΉΈ͍ͨͳ ݹࣜΏ͔͍͠ख๏ (ຯ͕ͩޮ͘)
ΩϟογϡϛυϧΣΞ૿͑Δ ΩϟογϡͷҝʹϛυϧΣΞ͕૿͑Δ ୯७ʹোཁҼ͕૿͑Δʂʂʂʂʂ
ΩϟογϡϛυϧΣΞ૿͑Δ γεςϜΛ҆ఆͤ͞ΔͨΊʹಋೖͨ͠ ΩϟογϡϛυϧΣΞ͕ෆ҆ఆͳ͔Γʹ ҎલΑΓՔಇ͕Լ͕ͬͯ͠·͏ͱ͍͏ࠈ
ΩϟογϡϛυϧΣΞ૿͑Δ - ΈͩΓʹϛυϧΣΞΛ૿͞ͳ͍ํͰؤுΔ - طଘͷίϯϙʔωϯτͰ༻͕Ͱ͖Δ͔ʁ
Ͳ͏͍͏࣌ʹΩϟογϡΛΘͳ͍͖͔
σʔλ͕ফ͑Δͱக໋తͳ߹ - σʔλ͕ڏۭʹফ͑ΔͱഛঈʂʂɹΈ͍ͨͳ ͱ͜Ζʹ͏͖Ͱͳ͍ - Ωϟογϡͷσʔλফ͑Δͷͱߟ͑Δ
σʔλ͕ফ͑Δͱக໋తͳ߹ - σʔλ͕ڏۭʹফ͑ΔͱഛঈʂʂɹΈ͍ͨͳ ͱ͜Ζʹ͏͖Ͱͳ͍ - Ωϟογϡͷσʔλফ͑Δͷͱߟ͑Δ ͔͠͠αʔϏεӡ༻্ফ͑ͯྑ͍σʔλ ͳΜͯ΄ͱΜͲͳ͍ͧʂʂʂ
ΩϟογϡΛ࠶ߏஙग़དྷͳ͍߹ - ΩϟογϡͷσʔλͿͬյΕͯ࠶ߏங Ͱ͖Εͳ͍ - όονͰDB͔ΒΩϟογϡ࠶ੜͱ͔Ͱ - ٯʹݴ͏ͱΩϟογϡΛ࠶ߏஙͰ͖ͳ͍߹ ͏͖Ͱͳ͍
ଞʹ৭ʑ͋Δ…… ݁ߏΩϟογϡΛ͏͖Ͱͳ͍Օॴ ۙʹᷓΕ͍ͯΔ
Ωϟογϡຑༀ
Ωϟογϡʹ·ͭΘΔॾΛ͏͚ͯ ΩϟογϡϚδَ
ҰΩϟογϡΛ͏ͱΕͳ͘ͳΔ - ҆қͳؾ࣋ͪͰΩϟογϡΛ͏ͱ ͦͷ෦͕͏͔ͬΓ͘ͳͬͯ͠·͏ - ଞͷ෦Ͱͦͷߴ͞ΛٻΊΒΕΔ ͠ΐ͏͕ͳ͍ͷͰΩϟογϡ͍·͔͢…… - Α͏ͦ͜Ωϟογϡপ
ҰΩϟογϡΛ͏ͱΕͳ͘ͳΔ - Ωϟογϡجຊతʹෳࡶͳػߏ - ೖΕΔͷ؆୯ɼൈ͘ͷ͕͍͠ - ΩϟογϡͱҰੜ͖߹͍֮ͬͯ͘ޛ͕͋Δ͔
Ωϟογϡͷڪාʂʂʂ ʮͳΜ͔͜ͷ෦͍ͬ͢Ͷ͑ʯ ʮDB٧·ͬͯΜ͡ΌΜʁɹΩϟογϡ͠Α͏ͥʯ ʮOKOKʯ
Ωϟογϡͷڪාʂʂʂ ʮͳΜ͔͜ͷ෦͍ͬ͢Ͷ͑ʯ ʮDB٧·ͬͯΜ͡ΌΜʁɹΩϟογϡ͠Α͏ͥʯ ʮOKOKʯ OKͰͳ͍ʂʂʂʂʂ
Ωϟογϡͷڪාʂʂʂ ͍ʂ ෲཱͭʂʂ Ωϟογϡ͢Δʂʂʂ
҆қͳΩϟογϡΛ ΊΖʂʂʂʂ
ͪΌΜͱઃܭΛ͢Δ
ͪΌΜͱઃܭΛ͢Δ - ͪΌΜͱDB (σʔλϞσϧ) ͷઃܭΛ͢Δ - ΠϯσοΫεͱؚ͔Ίͯ - มͳΞʔΩςΫνϟΛΊΔ -
ϘτϧωοΫʹͳΓ͕ͪ - ʮͨΓલͷ͜ͱΛͨΓલʹΔʯ
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query
ΫΤϦ (͋Δ͍ςʔϒϧ)Λͤʂʂʂ దʹνϡʔχϯά͞ΕͨΫΤϦʹ ΩϟογϡͳͲෆཁ
Ͳ͏ͬͯΫΤϦ͕͍ Server Client Client . . . RDBMS Slow Query
Slave Slave ΩϟογϡʹཔΒͣ SlaveΛฒΔΑ͠
֎෦αʔϏεʹґଘ͍ͯ͠Δ Server Client Client . . . Outer Service Request
(via HTTP)
֎෦αʔϏεʹґଘ͍ͯ͠Δ Server Client Client . . . Outer Service Request
(via HTTP) ֎෦αʔϏεʹґଘ͠ͳ͍ ํ๏Λߟ͑Δ
ͪΌΜͱଌఆΛ͢Δ
ͪΌΜͱଌఆΛ͢Δ - ΩϟογϡΛ༻͍Δ͜ͱͰຊʹޮ͍͍ͯΔͷ͔ - ෛՙ͕Լ͕͍ͬͯΔʁ - ϨεϙϯελΠϜ͕վળ͍ͯ͠Δʁ - αʔϏεͷՄ༻ੑ্͕ঢ͍ͯ͠Δʁ
ͪΌΜͱଌఆΛ͢Δ - ΩϟογϡΛ༻͍Δ͜ͱͰຊʹޮ͍͍ͯΔͷ͔ - ෛՙ͕Լ͕͍ͬͯΔʁ - ϨεϙϯελΠϜ͕վળ͍ͯ͠Δʁ - αʔϏεͷՄ༻ੑ্͕ঢ͍ͯ͠Δʁ ΩϟογϡΛೖΕ͚ͨͩͰ
تΜͰ͍ͯବ
ͪΌΜͱଌఆΛ͢Δ - ΩϟογϡΛ༻͍Δ͜ͱͰຊʹޮ͍͍ͯΔͷ͔ - େͯ͠ޮ͔͵ΩϟογϡͳΒೖΕΔ͚ͩෛ࠴
Ωϟογϡຑༀ Ωϟογϡ࠷ऴฌث
ຊʹඞཁͳ࣌ʹ͚ͩ ΩϟογϡΛ͍·͠ΐ͏
Θͳͯ͘ࡁΉͷͳΒ ΩϟογϡΛΊΑ͏ʂʂ
Q?
͕࣌ؒ͋Εͷίʔφʔ
VarnishͷΛ͍ͯ͠·ͤΜͶʁ
VarnishͷΛ͍ͯ͠·ͤΜͶʁ - ͢Έ·ͤΜαʔϏεͰͬͨ͜ͱͳ͍ͷͰ ҰΕ·ͤΜ - ༗ӹͳΠϯλʔωοτ্ʹͨ͘͞Μ ࢿྉ͕͋Γ·͢ (YAPC 2011ͷmala͞ΜͷࢿྉͳͲ) -
ΠϯλʔωοτʹͳΜͰ͋Δ
ΩϟογϡετϨʔδબఆ
ΩϟογϡετϨʔδબఆ - ༻్ - ࢄ͢Δඞཁ͕͋Δ͔ - Խ͢Δඞཁ͕͋Δ͔ - ͬͯΔΫϥυϓϥοτϑΥʔϜͰαϙʔτ ͍ͯ͠Δ͔Ͳ͏͔
- ετϨʔδʹৄ͍͠ਓ͕͍Εྑ͍
ΩϟογϡετϨʔδબఆ
ΩϟογϡετϨʔδͷ Խߏʹ͍ͭͯ
Խ - Redisͩͱsentinelͱ͔clusterͱ͔ - memdͷ߹ܥΛෳ༻ҙ͢Δͱ͔ - ࣗͰϧʔςΟϯάΛॻ͘ඞཁ͕͋Δ - ͍҃mcrouterͳͲ…… -
ຊʹԽ͕ඞཁͳͷ͔Ͳ͏͔Λߟ͑Δ ඞཁ͋Δ