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
Cloudflare Workersで動的コンテンツをキャッシュする際の新たな選択肢
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
yoshitaka KOITABASHI
August 24, 2023
Technology
3.2k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cloudflare Workersで動的コンテンツをキャッシュする際の新たな選択肢
yoshitaka KOITABASHI
August 24, 2023
More Decks by yoshitaka KOITABASHI
See All by yoshitaka KOITABASHI
変化と挑戦:NoSQLとNewSQL Serverless Databaseの技術革新とマルチテナンシーの秘密
yoshiitaka
23
6.5k
コードファーストの考え方。 Amplify Gen2から学ぶAWS次世代のWeb開発体験
yoshiitaka
3
2.1k
大規模なアジャイル開発の現場と技術負債 / Technical Debt
yoshiitaka
23
5.8k
Re:cap container Services
yoshiitaka
2
610
The_Frugal_Architectの観点から眺めるServerless.pdf
yoshiitaka
1
180
re:Inventに行くと何を得られ、なぜ人はラスベガスに行くのか
yoshiitaka
0
160
コンテナ支部recapをrecapしよう_気になったコンテナの周りのアップデートを紹介.pdf
yoshiitaka
1
1.1k
AWS re:Invent 2023の期間中に出たコンテナアップデート集
yoshiitaka
4
830
stripeを組み合わせたサーバレスアーキテクチャとシードのスタートアップ ビジネスをグロースするためにやったこと
yoshiitaka
3
630
Other Decks in Technology
See All in Technology
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
0
110
AI時代における最適なQA組織の作り方
ymty
3
170
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
220
AWS Summit 2026で見えたSIerにとっての Amazon Quickの位置づけ
maf_0521
0
120
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
130
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
150
「ビジネスがわかるエンジニア」とは何か?
ryooob
0
350
AIに障害切り分けを全部やってもらった。 。 。 。
estie
0
260
組織における AI-DLC 実践
askul
0
170
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
180
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
150
週末にループ・エンジニアリングの理解を深めるためのスライド
nagatsu
0
590
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.5k
Bash Introduction
62gerente
615
220k
Deep Space Network (abreviated)
tonyrice
0
210
Site-Speed That Sticks
csswizardry
13
1.2k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Making the Leap to Tech Lead
cromwellryan
135
9.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
550
The Limits of Empathy - UXLibs8
cassininazir
1
370
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
200
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Transcript
Cloudflare Workersで動的コンテンツを キャッシュする際の新たな選択肢 KOITABASHI Yoshitaka 2023/8/24 yoshii0110 1
2023/8/24 yoshii0110 2 KOITABASHI Yoshitaka @yoshii0110 Momento - community advocate
KDDIアジャイル開発センター – software engineer Amazon EC2, AWS Fargate, AWS App Runner 🥷 🏢 💕
静的コンテンツと動的コンテンツ • 静的なコンテンツを配信するwebページ ユーザが毎回閲覧する度に表示内容が変わらず同じものが配信 よくあるLPや個人ブログなども静的なコンテンツとして取り扱ってそう コンテンツ例: HTMLファイルや画像など • 動的なコンテンツを配信するwebページ あるページへアクセスするタイミング、ページの位置、デバイスなどの
ユーザ固有の要因に基づいて変化するコンテンツを配信 技術記事プラットフォームなど、大量のユーザが記事を公開/閲覧を 行うサービスなどが該当 2023/8/24 yoshii0110 3
モダンなフロントエンドのページレンダリング • Reactive Web Application • Client Side Rendering (CSR)
=> CSRでできたアプリが、Sigle Page Application (SPA) – React, Vue, Angular とかとか • Server Side Rendering (SSR) – Next, Nuxt とかとか • Static Site Generator (SSG) Jamstackな仕組み, Gatsby, Hugo, Next, Nuxt とかとか • Incremental Static Regeneration (ISR) – Next (9.4で追加された機能) 2023/8/24 yoshii0110 4
SSR (Server Side Rendering) • リクエストに対して動的に生成されたHTMLを返却 • JavaScript、仮想DOMなどをサーバーサイドでも利用 • デメリットは、サーバーサイドの重さです。
API通信などを利用すると、レスポンスに時間がかかる 2023/8/24 yoshii0110 5
SSG (Static Site Generator) • リクエストに対して事前に生成されたHTMLを返却 • SSGではビルド時にHTMLを生成 • 配信は非常に高速だが、デプロイ後はページ内容を動的に変更できない
2023/8/24 yoshii0110 6
ISR (Incremental Static Regeneration) • リクエストに対して静的にビルドされたページを返す。 • 有効期限を超えたら非同期で静的ページの再生成をSSRで行う。 • キャッシュを活用しつつ、静的ページの更新を自動的に行え、一定時間後再度
リクエストがあった場合、次回以降の内容をビルドするので内容が更新される。 2023/8/24 yoshii0110 7
静的コンテンツのキャッシュ • 例えば、SSGで作成されたHTML, CSS, JS 画像などの 静的コンテンツを返却する応答時間を短くしたい場合に考える キャッシュ戦略として CDN(content delivery
network) を使用する方法があります。 • CDNは、オリジンサーバーへのアクセス集中を防ぎ、地理的に 近いエッジロケーション(エッジサーバー)に誘導するイメージ。 • エッジロケーションは世界中に配置されており、 パブリッククラウドのリージョンにあるデータセンターよりも分散的に より多く設置されている。 2023/8/24 yoshii0110 8
CDNの標準的な使われ方 • よくあるのは、エッジロケーションはユーザーからの アクセスがあると、オリジンサーバを参照して次回以降の アクセスのためにコンテンツをキャッシュします。 • 次回以降のアクセスでは、キャッシュしたコンテンツを ユーザーに配信する 2023/8/24 yoshii0110
9
モダンなWebアプリケーションとCDN • 近年だと、先ほど紹介したページレンダリングの仕組みが たくさんある中で、ブラウザ側のjavascriptが行う仕事が増え、 jsファイルのサイズも大きくなってきています。 • SSGを使ったとしても、サイズが大きくなったHTML、javascriptをよ りユーザに早く届ける時にCDNが重要です。 • 最近だとCDNを意識しないで使えるサービスもあります。
• Vercel • AWS Amplify 2023/8/24 yoshii0110 10
動的コンテンツのキャッシュ • 例えば、SSR/ISRの様にその時々でアクセスする度にコンテンツが 変わったり、webアプリ上のコンテンツを何かしらのスクリプトや トリガーによって変更が走り生成されるパターンがあったりします。 • 動的コンテンツの配信について、ユーザへの応答時間を短縮するには、 ユーザにより遠くにあるオリジンサーバへ毎回アクセスするのではなく、 CDN上でスクリプトが実行できると嬉しいですよね? •
これによって、動的コンテンツは”キャッシュされる“ので、クライアント からのリクエストへの応答時間が短縮され、動的コンテンツを扱う webアプリケーションが高速化されます。 2023/8/24 yoshii0110 11
CDNのエッジサーバでアプリケーション実行 • 近年だとCDNのエッジ上でjavascriptなどが実行できるサービスに人気が出てま す。 • なぜ、そんな話をしているのかというと、エッジでアプリケーションが実行できると、 動的コンテンツのキャッシュに作用してくるからです。 • ユーザ起因のイベント、web サーバ起因のイベントなどを基に動的コンテンツを生
成してクライアントに提供したり、静的コンテンツを変更、キャッシュの操作ができ る様になります。 • Cloudflare Workers • Vercel Edge Functions • AWS CloudFront Functions • AWS Lambda@Edge 2023/8/24 yoshii0110 12 引用: https://blog.cloudflare.com/eliminating-cold-starts-with-cloudflare-workers/
今回実現したいこと • Stale-While-Revalidate から着想された @yusukebe さんの “Dynamic Content Storing” を踏襲する
• これをhonoとCloudflare Workers、momento cacheを利用して 実装していく 2023/8/24 yoshii0110 13 https://yusukebe.com/posts/2022/dcs/ https://datatracker.ietf.org/doc/html/rfc5861
キャッシュ戦略: Stale-While-Revalidate • web ではキャッシュの制御にHTTPヘッダを用いてブラウザやプロキシを コントロールする。 • Stale-While-Revalidate は、そんなヘッダでキャッシュ制御する仕組みです。 •
よくキャッシュの指定でCache-Control,Expires,Etag,Last-Modifiedなどの ものを利用すると思う。 • Stale-While-Revalidateを利用すると動きとして、コンテンツは キャッシュから表示するが、裏で非同期にキャッシュを更新しておく ような動きになります。 2023/8/24 yoshii0110 14 https://docs.fastly.com/ja/guides/serving-stale-content https://datatracker.ietf.org/doc/html/rfc5861
Stale-While-Revalidateのフロー 2023/8/24 yoshii0110 15 https://blog.jxck.io/entries/2016-04-16/stale-while-revalidate.html 従来: max-age Stale-While-Revalidate
Cloudflare Workers / honoとは? • Cloudflare Workers • Cloudflareのサーバレスサービス •
AWS Lambda や Google Cloud Functions などとは異なり、 CDNのエッジサーバーでコードを実行する • V8エンジンのisolateを使い、各リクエストに対して独立した実行環境を提供 • hono • エッジ用に開発された小さく、シンプルかつ超高速な Web フレームワーク • repo: https://github.com/honojs/hono • docs: https://hono.dev/ 2023/8/24 yoshii0110 16
Momento とは? • Momento とは、アプリケーションエンジニアにとって快適な世界を 作っていき、彼らによって生み出されたサービスをより早く、 よりセキュアに、より安定的に送り出す仕組みを提供する サーバレスサービスです。 • 機能として、現時点だと3つ
①: momento Cache ②: momento Topics (Pub/Sub) ③: momento Vector Index (AI / ML) 2023/8/24 yoshii0110 17 https://www.gomomento.com/
Momento chache を利用したキャッシュ戦略 2023/8/24 yoshii0110 18
Momento cache のシンプルさ 2023/8/24 yoshii0110 19
Momento chache を利用したキャッシュ戦略 – 基本の動作シーケンス図 2023/8/24 yoshii0110 20 ①: ユーザがあるwebページを
見たときに、Cloudflare workers はoriginではなく、momento cacheから動的コンテンツを取得 ②: momento cacheにコンテンツの キャッシュがなければ、originへ fetchする
Momento chache を利用したキャッシュ戦略 – キャッシュ細かい流れに注目したシーケンス図 2023/8/24 yoshii0110 21 前提として、momento cacheには
同じ動的コンテンツが2つキャッシュされている "fresh", "stale"というプレフィックスをつけたkeyで 同じレスポンスをキャッシュする “stale”の方のttlを 長めに設定 ①: まずは"fresh"というプレフィックスの keyでキャッシュしたvalueを返却 ②: "fresh"のキャッシュのTTLが切れたら、 "stale" の キャッシュを返し、 “fresh”はfetchし直したキャッシュと入れ替える
検証 2023/8/24 yoshii0110 22 TTLが切れていてもStaleが存在すれば fetchが実行され、 その後キャッシュする動きが見て取れる 検証repo: https://github.com/Yoshiitaka/momento-cloudflare-swr
キャッシュヒットとミスなどのメトリクスをコンソールより確認 2023/8/24 yoshii0110 23
Momento とCloudflareとの統合 • ブログ: https://www.gomomento.com/blog/momento-cache-is-now-accessible-at- the-edge • 公式ドキュメント: https://docs.momentohq.com/ja/develop/api-reference/http-api •
公式ドキュメント: https://docs.momentohq.com/ja/develop/integrations/cloudflare • サンプルコード: https://github.com/momentohq/client-sdk- javascript/tree/main/examples/cloudflare-workers 2023/8/24 yoshii0110 24
他のキャッシュとしての選択肢 • Cache API • KVストア • Upstash • etc…
2023/8/24 yoshii0110 25