Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cloudflare Workersで動的コンテンツをキャッシュする際の新たな選択肢

Cloudflare Workersで動的コンテンツをキャッシュする際の新たな選択肢

yoshitaka KOITABASHI

August 24, 2023
Tweet

More Decks by yoshitaka KOITABASHI

Other Decks in Technology

Transcript

  1. 2023/8/24 yoshii0110 2 KOITABASHI Yoshitaka @yoshii0110 Momento - community advocate

    KDDIアジャイル開発センター – software engineer Amazon EC2, AWS Fargate, AWS App Runner 🥷 🏢 💕
  2. モダンなフロントエンドのページレンダリング • 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
  3. 静的コンテンツのキャッシュ • 例えば、SSGで作成されたHTML, CSS, JS 画像などの 静的コンテンツを返却する応答時間を短くしたい場合に考える キャッシュ戦略として CDN(content delivery

    network) を使用する方法があります。 • CDNは、オリジンサーバーへのアクセス集中を防ぎ、地理的に 近いエッジロケーション(エッジサーバー)に誘導するイメージ。 • エッジロケーションは世界中に配置されており、 パブリッククラウドのリージョンにあるデータセンターよりも分散的に より多く設置されている。 2023/8/24 yoshii0110 8
  4. 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/
  5. 今回実現したいこと • 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
  6. キャッシュ戦略: 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
  7. 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
  8. Momento chache を利用したキャッシュ戦略 – 基本の動作シーケンス図 2023/8/24 yoshii0110 20 ①: ユーザがあるwebページを

    見たときに、Cloudflare workers はoriginではなく、momento cacheから動的コンテンツを取得 ②: momento cacheにコンテンツの キャッシュがなければ、originへ fetchする
  9. Momento chache を利用したキャッシュ戦略 – キャッシュ細かい流れに注目したシーケンス図 2023/8/24 yoshii0110 21 前提として、momento cacheには

    同じ動的コンテンツが2つキャッシュされている "fresh", "stale"というプレフィックスをつけたkeyで 同じレスポンスをキャッシュする “stale”の方のttlを 長めに設定 ①: まずは"fresh"というプレフィックスの keyでキャッシュしたvalueを返却 ②: "fresh"のキャッシュのTTLが切れたら、 "stale" の キャッシュを返し、 “fresh”はfetchし直したキャッシュと入れ替える
  10. 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