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
Microservices on Fastly v1.1
Search
Ryo yasuda
February 20, 2019
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Microservices on Fastly v1.1
Ryo yasuda
February 20, 2019
More Decks by Ryo yasuda
See All by Ryo yasuda
GKE+Istio+GitOpsで作る日経電子版の次世代マイクロサービス基盤
ryysd
3
2.2k
日経電子版へのPWA導入事例
ryysd
1
390
Microservices on Fastly
ryysd
42
22k
Other Decks in Programming
See All in Programming
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
110
GitHubCopilotCLIのスラッシュコマンドを自作してみる
htkym
0
100
霧の中の代数的エフェクト
funnyycat
1
420
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
1
500
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
140
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
540
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.9k
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
170
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
230
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
210
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Chasing Engaging Ingredients in Design
codingconduct
0
240
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
How to build a perfect <img>
jonoalderson
1
5.8k
エンジニアに許された特別な時間の終わり
watany
108
250k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Making Projects Easy
brettharned
120
6.7k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Transcript
. ຊܦࡁ৽ฉࣾ ҆ా ཽ 'BTUMZ5FDI5BML
o E (r , eak i N T n
j ea )r p chmti i :5 25 1 s R S S .- l g 6 3 0:3 :
3 1 2 - 0
. () / ) (
AD
. Service A Service C Service B Service D Routing
Caching Dev Debug Logging Auth ESI
. Service A Service C Service B Service D Routing
Caching Dev Debug Logging ESI ৽ωλ Dynamic Critical CSS Auth
Service A Service C Service B Service D Service
Registry ֤αʔϏεͷใཧ ϔϧενΣοΫ ϦΫΤετઌαʔϏεͷใऔಘ ϦΫΤετͷૹ৴
Routing Caching Dev Debug Logging Auth ESI Service A
Service C Service B Service D • F • •
Routing Caching Dev Debug Logging ESI Service A Service
C Service B Service D • I • F Auth
هࣄαʔϏε هࣄߋ৽௨ max-age: 604800 purge •
'+25*-1/&%"! #3 • *-(. /&%"! #,) • 40$
Routing Caching Dev Debug Logging ESI Service A Service
C Service B Service D • - • - • origin͕ࢮΜͰࢦఆͨ͠ظؒΩϟογϡΛར༻ͯ͘͠ΕΔઃఆ Service B͕ࢮΜͰ ΩϟογϡΛͬͯՔಇ Auth
- - Routing Caching Dev Debug Logging ESI Service A
Service C Service B Service D • F M R • • H Service D Nikkei-Routing-Override: serviceD->serviceD-tunnel Local Machine t u n n e l Auth
• F D I D • ) ( ( (
• F D H R Routing Caching Dev Debug Logging ESI Service A Service C Service B Service D Nikkei-Routing-Journey: serviceA Nikkei-Routing-Journey: serviceA,serviceB Nikkei-Routing-Journey: serviceA,service,serviceD Auth
Routing Caching Dev Debug Logging ESI Service A Service
C Service B Service D • • • F Real Time Log Streaming request url status code response size taken time cache HIT/MISS ... Auth
None
֤αʔϏεɾ֤ύεʹର͢ΔΩϟογϡώοτ Ϣʔβछผ͝ͱͷΩϟογϡώοτ (هࣄϖʔδ)
Routing Caching Dev Debug Logging ESI Service A Service
C Service B Service D • • ! • " Auth
هࣄϖʔδ /article/123 Cookie: Auth=a124b5... OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
ϢʔβͷݖݶʹΑͬͯ ίϯςϯπมΘΔ
هࣄϖʔδ /article/123 Cookie: Auth=a124b5… Cache-control: no-cache,
no-store Cookie: Auth=a124b5... Cache-control: no-cache, no-store OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
هࣄϖʔδ /article/123 ϦΫΤετϔομ User-ID: 98765 User-Rank:
paid Ϩεϙϯεϔομ Vary: User-Rank Cookie: Auth=a124b5... Cache-control: private ೝূΫοΩʔͷ decodeɾvalidate OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
هࣄϖʔδ /article/123 ϦΫΤετϔομ User-ID: 98765 User-Rank:
paid Ϩεϙϯεϔομ Vary: User-Rank Cookie: Auth=a124b5... Cache-control: private ೝূΫοΩʔͷ decodeɾvalidate OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ User-Rank͝ͱʹΩϟογϡ͚ ΔΑ͏CDNʹ໋ྩ
ඇձһ ༗ྉձһ ແྉձһ Ϣʔβछผ͝ͱͷهࣄϖʔδΩϟογϡώοτ
ϩάΠϯϢʔβʹରͯ͠ΩϟογϡͰ͖ͯΔ
( ) Routing Caching Dev Debug Logging Auth ESI Service
A Service C Service B Service D •
• ɾ ɾ ɾ ←ͷදࣔʹඞཁͳ࠷ݶͷCSSΛ HTMLʹຒΊࠐΉ
←ͷCSSը໘දࣔޙʹಡΈࠐΉ
• • CSSऔಘʹඞཁͳϦΫΤετɾαΠζΛݮΒͤΔ (544KB → 69KB)
• CSSOMߏஙɾϨΠΞτͷ࣌ؒΛݮͰ͖Δ
• C •
֤ϖʔδʹ࠷దԽ͞ΕͨCCSSΛΞΫηε࣌ʹੜ͠ ESIͰຒΊࠐΉ
Server Cache Control max-age=600 Cache Control: private <esi:include src=“http://example.com/mynews.html” />
index.html mynews.html
• • • C C EI <html> <style> <esi:include src=”/critical.css?service=article”>
<style> … </html> Critical CSS Server Critical CSSͷ Ϗϧυ&৴ Cache Control: private Application Server Cache Control max-age=600
• • • C C EI <html> <style> <esi:include src=”/critical.css?service=article”>
<style> … </html> Critical CSS Server Critical CSSͷ Ϗϧυ&৴ Application Server Cache Control max-age=600 Cache Control max-age=86400
App Server … <style> <esi:include src=”critical.css”> <style> …
App Server Critical CSS Server ./critical.css … <style> <esi:include src=”critical.css”>
<style> …
App Server ./critical.css S3 Critical CSS Server critical CSS͕͋Δ͔֬ೝ …
<style> <esi:include src=”critical.css”> <style> …
App Server ./critical.css S3 Critical CSS Server critical css͕ଘࡏ͠ͳ͍ ͷͰ௨ৗͷCSSΛฦ٫
FastlyΩϟογϡ CSS Cache … <style> <esi:include src=”critical.css”> <style> …
App Server ./critical.css S3 Critical CSS Server Critical CSS Builder
ඇಉظͰϏϧυཁٻ CSS Cache … <style> <esi:include src=”critical.css”> <style> …
App Server ./critical.css S3 Critical CSS Server Critical CSS Builder
Ϗϧυ͕ྃͨ͠ΒS3อଘ ඇಉظͰϏϧυཁٻ CSS Cache … <style> <esi:include src=”critical.css”> <style> …
App Server ./critical.css S3 Critical CSS Server Critical CSS Builder
Ωϟογϡ͞Εͨ ௨ৗͷCSSΛPurge ඇಉظͰϏϧυཁٻ … <style> <esi:include src=”critical.css”> <style> … CSS Cache
App Server ./critical.css S3 Critical CSS Server Critical CSS Builder
ඇಉظͰϏϧυཁٻ Critical CSS Cache ࣍ճΞΫηε࣌ɺ Critical CSSΛฦ٫ FastlyΩϟογϡ … <style> <esi:include src=”critical.css”> <style> …
• J S •
S d d
F C e h S I E c a
None
None
Routing Caching Logging Auth Vanity URL ESI hub service •
$ #%" • & ' $! ”/” ”/hub/front” ද͖URL ෦URL
table vanities { ”/”: ”/hub/front” … } Routing Caching Logging
Auth Vanity URL ESI • F D • E • R F D U L ”/” ද͖URL hub service ”/hub/front” ෦URL
None
Top Article API ֎෦Ϧιʔε /article/123 Path Based Routing
backends.vcl routing.vcl backend article { .host:
"article.xx.jp"; .port: 443 .ssl: true } ... if (req.url ~ "/article/.+") { req.backend = article; } ... vclͰαʔϏεΛఆٛ ϧʔςΟϯά༻ͷvcl
[ { "name": "article", "path": "/article/.+", "host": "article.xx.jp", "ssl": true
} … ] services.json backends.vcl routing.vcl શαʔϏεͷఆٛϑΝΠϧ ͲΜͳαʔϏεɺϧʔτ͕͋Δ ͔ͻͱͰΘ͔Δ backend article { .host: "article.xx.jp"; .port: 443 .ssl: true } ... if (req.url ~ "/article/.+") { req.backend = article; } ... vclͰαʔϏεΛఆٛ ϧʔςΟϯά༻ͷvcl
if (beresp.http.Cache-Control !~ "(stale-if-error|immutable|private)") { set beresp.stale_if_error = 86400s;
} Next NikkeiͰɺstale-if-errorΛࣗಈͰ༩ αʔϏε͕ࢮΜͰɺΩϟογϡ͕͋Ε͠Β͘ίϯςϯπΛฦͤΔ stale-if-error
ೝূΫοΩʔ(JWTܗࣜ): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ A
:J :C AA :, - : :; :C AA : 414 $" 14 $ 14 $ " .6 B :D ;: 6 :+)5 : A : - = I ;: 6 5 6(*+5 6 :+) " 4 6 :; 6 6 ?A6 4 . 2 ,2 2 $" . 2 "
if (req.http.Cookie:Auth !~ "(^[^¥.]+)¥.([^¥.]+)¥.([^¥.]+)$") { set
req.http.Auth-Valid = "false"; } set var.base64Header = re.group.1; set var.base64Payload = re.group.2; set var.signature = digest.base64url_decode(re.group.3); set var.validSignature = digest.base64_decode(digest.hmac_sha256_base64(var.jwtSecret, var.base64Header "." var.base64Payload)); set var.payload = digest.base64_decode(var.base64Payload); set var.expires = regsub(var.payload, {"^.*?"exp"¥s*:¥s*(¥d+).*?$"}, "¥1"); # γάωνϟͷਖ਼ੑͱ༗ޮظݶͷ֬ೝ if (var.signature != var.validSignature || time.is_after(now, std.integer2time(std.atoi(var.expires)))) { set req.http.Auth-Valid = "false"; } # payload͔ΒݖݶใͳͲΛநग़ req.http. UserID = regsub(var.payload, {"^.*?"uid"¥s*:¥s*"(¥w+)".*?$"}, "¥1");
sub vcl_log { log
{"syslog "} req.service_id {" fastly-log :: "} {" timestamp_us:"} time.start.usec {" host:"} regsuball(req.http.X-Forwarded-Host, {" "}, "") {" upstream_host:"} regsuball(req.http.Host, {" "}, "") {" remote_addr:"} client.ip {" method:"} req.request {" fastly_x_cache:"} req.http.X-Cache {" fastly_x_cache_hits:"} req.http.X-Cache-Hits {" user_id:"} req.http.User-ID {" user_rank:"} req.http.User-Rank; … } LTSVܗࣜͰͷϩάग़ྗྫ