Slide 1

Slide 1 text

© 2023 Ateam Inc. Cloudflare Workers と KV で キャッシュを非同期に更新する Cloudflare Meetup Nagoya

Slide 2

Slide 2 text

© 2023 Ateam Inc. 自己紹介 Who am I ? Name: Aiji Uejima Twitter: aiji42_dev Github: aiji42 株式会社エイチームライフデザイン技術開発室所属 リードエンジニア 最近興味があるのはエッジランタイム。 毎日プライベートでGithubに草生やしながら頑張ってます! 2

Slide 3

Slide 3 text

© 2023 Ateam Inc. モチベーション VercelのISRをCloudflareでも実現したい 3 https://www.smashingmagazine.com/2021/04/incremental-static-regeneration-nextjs/

Slide 4

Slide 4 text

© 2023 Ateam Inc. SwR ISRのベースになっているのはstale-while-revalidate 4 https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate

Slide 5

Slide 5 text

© 2023 Ateam Inc. SwR Cache-Control: max-age=x, stale-while-revalidate=x 5 t max-age stale-while-revalidate max-age以内はキャッシュは新鮮 max-age以降、SwR以内はキャッシュは古い ただし再検証(キャッシュの更新)中は使っても良い Cache Cache-Control: max-age=60, stale-while-revalidate=120 なら... - 60 + 120 = 180秒間はキャッシュを使っていいよ - でも60秒以上経ったら、キャッシュを使っていいけど裏で更新してね

Slide 6

Slide 6 text

© 2023 Ateam Inc. CF Workers と KV を使って エッジ上でキャッシュをコントロールする 6

Slide 7

Slide 7 text

© 2023 Ateam Inc. Cloudflare Workers と KV 7 Cloudflare Workers - Cloudflareの各データセンターに配置されたエッジコンピューティング - 日本国内だけでも4つのロケーションがある - オリジンのリソースにプロキシすることも、単独でレスポンスを返すことも可能(Edge as Origin) - Javascriptで記述が可能 - コールドスタートのレイテンシが殆どないのが特徴 (https://blog.cloudflare.com/eliminating-cold-starts- with-cloudflare-workers/) Cloudflare Workers KV - Cloudflare Workers で利用するための Key-Value ストア - 書き込み頻度は低いが、高速かつ頻繁に読み出すデータに最適 - 変更が世界中のDCに伝搬するのに最大60s (※強整合ではない)

Slide 8

Slide 8 text

© 2023 Ateam Inc. 8 Cloudflare Workers と KV を使ったキャッシュの非同期更新機構 max-age SwR max-age SwR Cache-Control: max-age=60, stale- while-revalidate=60 Cache-Control: max-age=60, stale- while-revalidate=60 KVにキャッシュを保存 キャッシュを更新 + KV

Slide 9

Slide 9 text

© 2023 Ateam Inc. 実演 9

Slide 10

Slide 10 text

© 2023 Ateam Inc. 実演で使ったソースコードは githubにおいておきました! 10 https://github.com/aiji42/cloudflare-meetup-nagoya-1

Slide 11

Slide 11 text

© 2023 Ateam Inc. ワンポイントアドバイス KVのmetadataを使おう 11 KV は Key-Value だけでなく、任意のメータ情報を格納できる KVの有効期限 = キャッシュの有効期限 = max-age + SwR このTTLを超えるとキャッシュが破棄される 格納時点の時間 + max-age を計算しメタ情報に格納 取り出したときに取得時間と比較して、キャッシュが新鮮かどうかを判定する (新鮮でなければ、キャッシュを返却しつつバックグラウンドでキャッシュを更新する)

Slide 12

Slide 12 text

© 2023 Ateam Inc. ワンポイントアドバイス キャッシュの更新は waitUntil を使ってバックグラウンドで行おう 12 KVへのデータ格納はPromiseが返却されるので、本来はawaitで完了を待つ必要がある。 しかし、そうするとその分のレイテンシが発生してしまう。 waitUntilを使用すると、return後もPromiseが解消するまでバックグラウンドで生かし続けてくれる。

Slide 13

Slide 13 text

© 2023 Ateam Inc. おわり 13