ちゃんるいすのブログ

オタクエンジニアの雑記

Cloudflare WorkersKV を試す、ベンチマークもあるよ


Cloudflare WorkersKV 夢あって、個人サービスに導入してみたので感想
uploader.xzy.pw

Cloudflare WorkersKV について

Cloudflare WorkersKV の説明の前に、Cloudflare Worker の説明を。
Cloudflare の色んなとこにあるエッジでコードを実行することで、よりユーザーに近いとこで低レイテンシでコンテンツを提供できる。

この色んなとこにあるエッジを生かして、Key-Value Store を提供したのが Cloudflare WorkersKV

developers.cloudflare.com

Workers KV is a global, low-latency, key-value data store. It supports exceptionally high read volumes with low-latency, making it possible to build highly dynamic APIs and websites which respond as quickly as a cached static file would.

これだけみると、キャッシュ用途としても使えそうなイキフンがある。


f:id:rarirureluis:20190621213918p:plain
知名度は皆無

料金

月 $5 からで下記が含まれる。
1 GB of Worker KV storage
10 million Worker KV reads per month
1 million Worker KV writes per month
1 million Worker KV deletes per month
1 million Worker KV list operations per month

超過すると
$0.50 per GB of additional Worker KV storage per month
$0.50 per million additional Worker KV reads
$5.00 per million additional Worker KV writes
$5.00 per million additional Worker KV deletes
$5.00 per million additional Worker KV list operations

始め方

f:id:rarirureluis:20190621212754p:plain
対象ドメイン → Worker

これで、KVS(Namespace) が作られる。ID をメモっておく。
他にも、API と、Organization ID が必要。

公式 SDK で WorkersKV の操作

// client
api, err := cloudflare.New(os.Getenv("CF_API"), os.Getenv("CF_EMAIL"), cloudflare.UsingOrganization(os.Getenv("CF_ORG_ID")))

// write
api.WriteWorkersKV(context.Background(), NamespaceID, key, []byte("value"))

// read
api.ReadWorkersKV(context.Background(), NamespaceID, key)

memcache と同じでシンプルな KVS なので、Redis にあるような INCR とかはない。

ベンチマーク

コードはここから確認してください。不備があったら教えてください。
github.com

BenchmarkWriteKV-16                            3         420761100 ns/op           58597 B/op        125 allocs/op
BenchmarkReadKV-16                             5         362196140 ns/op           12107 B/op        102 allocs/op
BenchmarkWriteKV_Parallel160-16                5        1077852620 ns/op           94801 B/op        722 allocs/op
BenchmarkReadKV_Parallel160-16                 5         247583660 ns/op           14038 B/op        143 allocs/op

逐次書き込み:0.4s/op
逐次読み込み:0.4s/op
並列書き込み:1.1s/op
並列読み込み:0.25s/op

同じネットワーク内にある KVS に比べたらもちろん全体的に遅い。
並列にしたときの書き込みが 1.1s/op が気になる。
並列がどれぐらい許容できるのか分からんので、コードを弄ってテストしてみてください。

この人も同じことを言っているので決してクライアントのネットワークが悪いとかではなさそう。

本番で Cloudflare WorkersKV を使うのはやめたほうが良いかもしれない

最初に紹介した個人サービスで Cloudflare WorkersKV を導入したけど、困っていることがある。
uploader.xzy.pw

たまにキーが消える

EasyUploader での Cloudflare WorkersKV の用途はユーザーの CSRF トークンと、チャンクアップロードの際に TEMP ファイルのファイル名たちを記録している。
memcache から Cloudflare WorkersKV にリファクタリングしている最中に、CSRF トークンを書き込んだ後に取得しても無くなってたり、チャンクアップロードのデータが一部消えてたりした。
たまーーーーーーーーーに起きるので再現するために、ずっとループするプログラムを動かしてるがまだ正常なのでもしかしたらワイの実装が良くなかったかもしれない。

本番で使ってもいい?

良いよ!(支離滅裂)