MAGAZINE
ルーターマガジン
Cloudflare Workersにおけるデータ永続化のKVとDurable Objectsを比較・解説
はじめに
2022年6月現在、Cloudflare Workersではサーバーレスコンピューティングにおいてデータを永続化するサービスとしてWorkers KVとDurable Objectsの2種類を一般提供しています(ベータ版サービスを含めるとAWS S3互換のR2や、D1と呼ばれるSQLiteベースのRDBがあります)。これらのサービスはエッジサーバーから提供されるため、ユーザーは低レイテンシでデータを参照することができます。この記事ではKVとDurable Objectsを比較します。
忙しい人のための要約
KV | Durable Objects | |
---|---|---|
利用可能プラン | 無料プランから可能 | 有料プランのみ |
整合性 | 結果整合性 | 強い整合性 |
向いている用途 | 静的コンテンツ | リアルタイム・動的コンテンツ |
利用難易度 | 低い | 高い |
Workers KV
まず、KVはシンプルなキーバリューストアです。Workersの無料プランでも利用できるため、気軽に試すことができます。書き込み頻度が少なく、読み込み頻度が多い用途、静的コンテンツに適しています。バリューは最大25MBまでサポートされています。Workersの無料プランで利用することができ、作成はCloudflareのWebダッシュボードやcliツールのwranglerから行います。書き込んだデータはすべてのエッジサーバーに反映されるまでに最大で60秒ほどかかる場合があり、リアルタイム性が要求されるアプリケーションには向きません。また、同じキーに対して同時に書き込みが行われた場合、最後の書き込みで上書きされる仕様になっています。
KVのAPIドキュメントはこちらにあります。get
, put
, delete
の基本的なメソッドがあり、put時にTTL(残存期間)を指定することができます。他にはlist
と呼ばれるメソッドが存在しており、名前の通り、ある名前空間(=テーブル名のようなもの)に含まれるkeyをリストとして取得できます。一回のコールあたりの最大取得数は1000個のため、それ以上取得する場合は複数回コールする必要があります。さらに、prefixオプションを指定することで、特定の文字列で始まるkeyのみを抽出することができます。例えば、すべてのkeyが["user:alice:1", "user:alice:2", "user:bob:1"]
だったとき、prefixに"user:alice:"
を指定することで["user:alice:1", "user:alice:2"]
が取得できます。
Durable Objects
Durable Objects(耐久性のあるオブジェクト)はグローバルに一意の識別子を持つデータです。KVとは対照的に、同時書き込みに対しても順番に処理が行われ、データの整合性が保証されます。オブジェクトはWorkersがアイドル状態になるとストレージに書き込まれます。月5ドルのWorkers有料プランで利用できます。リアルタイムアプリの例として、Durable ObjectsとWebsocketを使ったチャットアプリのデモがhttps://edge-chat-demo.cloudflareworkers.com/で公開されています。Durable Objectsの使用法はこちらにあります。使いにくい点として、Durable Objectsはソースコード中でクラスを使って定義するオブジェクトという意味でプリミティブであり、複数のオブジェクトにまたがる複雑なクエリなどのAPIがありません。Cloudflare初のSQLデータベースであるD1はDurable Objectsの冗長化ストレージ上に構築されていると明言されているため、DBとして利用する場合は自前実装するより今後のサービスに期待した方が良いでしょう。他にDurable Objectsを使ったCloudflareのサービスとして、R2 storageやCloudflare Waiting Roomがあります。
まとめ
CloudflareのWorkers KVとDurable Objectsを比較しました。静的でリアルタイム性を求められないコンテンツにはKV、動的でリアルタイム性のあるコンテンツにはDurable Objectsが向いていることがわかりました。また、Durable Objectsの項目でも紹介しましたが、D1やR2など高水準なサービスが登場しつつあるので、場合によってはそちらの登場を待ったほうが良いかもしれません。CONTACT
お問い合わせ・ご依頼はこちらから