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
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
820
stripeを組み合わせたサーバレスアーキテクチャとシードのスタートアップ ビジネスをグロースするためにやったこと
yoshiitaka
3
620
Other Decks in Technology
See All in Technology
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.4k
React、まだ楽しくて草
uhyo
7
4.1k
Databricks における 生成AIガバナンスの実践
taka_aki
1
330
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
2.8k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
7
4.1k
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
740
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
SIer20年! 培ったスキルがスタートアップで輝く時
shucho0103
0
480
データ基盤をDataformで整えた話 〜 開発環境を添えて 〜
takapy
0
120
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.9k
新規ゲーム開発におけるAI駆動開発のリアル
202409e2
0
2.7k
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
250
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
350
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
KATA
mclloyd
PRO
35
15k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Producing Creativity
orderedlist
PRO
348
40k
Are puppies a ranking factor?
jonoalderson
1
3.5k
How to make the Groovebox
asonas
2
2.2k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
Color Theory Basics | Prateek | Gurzu
gurzu
0
350
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