2023/03/28 Cloudflare Meetup Nagoya Kick Off! で発表したLT資料です。 https://cfm-cts.connpass.com/event/275121/
© 2023 Ateam Inc.Cloudflare Workers と KV でキャッシュを非同期に更新するCloudflare Meetup Nagoya
View Slide
© 2023 Ateam Inc.自己紹介Who am I ?Name: Aiji UejimaTwitter: aiji42_devGithub: aiji42株式会社エイチームライフデザイン技術開発室所属リードエンジニア最近興味があるのはエッジランタイム。毎日プライベートでGithubに草生やしながら頑張ってます!2
© 2023 Ateam Inc.モチベーションVercelのISRをCloudflareでも実現したい3https://www.smashingmagazine.com/2021/04/incremental-static-regeneration-nextjs/
© 2023 Ateam Inc.SwRISRのベースになっているのはstale-while-revalidate4https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate
© 2023 Ateam Inc.SwRCache-Control: max-age=x, stale-while-revalidate=x5tmax-age stale-while-revalidatemax-age以内はキャッシュは新鮮 max-age以降、SwR以内はキャッシュは古いただし再検証(キャッシュの更新)中は使っても良いCacheCache-Control: max-age=60, stale-while-revalidate=120 なら...- 60 + 120 = 180秒間はキャッシュを使っていいよ- でも60秒以上経ったら、キャッシュを使っていいけど裏で更新してね
© 2023 Ateam Inc.CF Workers と KV を使ってエッジ上でキャッシュをコントロールする6
© 2023 Ateam Inc.Cloudflare Workers と KV7Cloudflare Workers- Cloudflareの各データセンターに配置されたエッジコンピューティング- 日本国内だけでも4つのロケーションがある- オリジンのリソースにプロキシすることも、単独でレスポンスを返すことも可能(Edge as Origin)- Javascriptで記述が可能- コールドスタートのレイテンシが殆どないのが特徴 (https://blog.cloudflare.com/eliminating-cold-starts-with-cloudflare-workers/)Cloudflare WorkersKV- Cloudflare Workers で利用するための Key-Value ストア- 書き込み頻度は低いが、高速かつ頻繁に読み出すデータに最適- 変更が世界中のDCに伝搬するのに最大60s (※強整合ではない)
© 2023 Ateam Inc. 8Cloudflare Workers と KV を使ったキャッシュの非同期更新機構max-age SwRmax-age SwRCache-Control: max-age=60, stale-while-revalidate=60Cache-Control: max-age=60, stale-while-revalidate=60KVにキャッシュを保存キャッシュを更新+ KV
© 2023 Ateam Inc.実演9
© 2023 Ateam Inc.実演で使ったソースコードはgithubにおいておきました!10https://github.com/aiji42/cloudflare-meetup-nagoya-1
© 2023 Ateam Inc.ワンポイントアドバイスKVのmetadataを使おう11KV は Key-Value だけでなく、任意のメータ情報を格納できるKVの有効期限 = キャッシュの有効期限 = max-age + SwRこのTTLを超えるとキャッシュが破棄される格納時点の時間 + max-age を計算しメタ情報に格納取り出したときに取得時間と比較して、キャッシュが新鮮かどうかを判定する(新鮮でなければ、キャッシュを返却しつつバックグラウンドでキャッシュを更新する)
© 2023 Ateam Inc.ワンポイントアドバイスキャッシュの更新は waitUntil を使ってバックグラウンドで行おう12KVへのデータ格納はPromiseが返却されるので、本来はawaitで完了を待つ必要がある。しかし、そうするとその分のレイテンシが発生してしまう。waitUntilを使用すると、return後もPromiseが解消するまでバックグラウンドで生かし続けてくれる。
© 2023 Ateam Inc.おわり13