Fastly Compute 永続ストレージへの読み書き (2) KVStore の利用
この記事は Fastly Compute (旧 Compute@Edge) 一人アドベントカレンダー 20 日目の記事です。
前回の記事で紹介した ConfigStore と SecretStore はオンメモリで高速に Read アクセスが可能な一方で、Write する機能がなかったり格納できるサイズも KB レベルのデータまでに限定されるなど使う用途がやや限られる永続ストレージとなっていました。本稿ではより大きなデータに対して Read/Write 両方のアクセスを提供する KVStore を紹介します。
KVStore の仕様
- グローバルでアクセスが可能な、結果整合性モデルで動作するデータストア
- API と SDK の両方からアクセス可能 (但し SDK からは Read のみ可能で Write 操作は不可)
- 1 store あたりのデータの保持数は無制限で、50 ストアまで利用可能
- Key 名には 1024 文字(UTF-8)まで使用可能。使用可能文字に制限あり(詳細)
- Value は 8000 文字まで格納可能
- 1 エントリあたりデフォルトで 25 MB まで格納可能
- サポートに問い合わせることで 100 MB までに制限値変更可能
設定方法
Dynamic Configuration の場合と同様の操作で設定可能です。
SDK 呼び出しの実装例
実装例についても前回のDynamic Configuration の場合の例と大きくは変わりません。ちなみに Rust SDK では非同期に lookup や insert を行うためのメソッドが最近追加されており Rust での使い勝手が向上しています。
# Rust の場合
let mut store = KVStore::open("my-app-data")?.unwrap();
store.insert("hello.txt", "world")?;
let value = store.lookup_str("hello.txt")?.unwrap();
# Go の場合
store, _ := kvstore.Open("my-app-data")
store.Insert("hello.txt", strings.NewReader("world"))
value, _ := store.Lookup("hello.txt")
# JavaScript の場合
const store = new KVStore('my-app-data')
await store.put('hello.txt', 'world')
const value = await store.get('hello.txt')
API アクセスの特徴と長所
他のデータストアとは異なり、KVStore の場合 API アクセスの場合でしか提供されていない操作がいくつかあり、状況によっては非常に便利に使える機能がその中に含まれているため紹介しておきます。
- KVStore 作成時にストアのロケーションとして "US" または "EU" を選択指定可能
- リファレンス
-
location
パラメータ(クエリストリング)に "US" または "EU" を指定してデータの保存地域を指定可能です。
- KVStore のエントリの書き込み時に TTL 指定と重複書き込みの防止が可能
- リファレンス
-
If-Generation-Match
ヘッダを指定することで重複書き込み防止が可能。例えば 0 を指定して書き込むことで、既にエントリが存在していたら書き込みに失敗させる、みたいな使い方が可能 -
time_to_live_sec
ヘッダを指定することで最大 24 時間までの TTL セットが可能
# curl コマンド例
$ curl -i -X PUT "https://api.fastly.com/resources/stores/kv/704si7t9lnew7s6bxqjbeg/keys/some-key" -H "Fastly-Key: <YOURKEY>" -H "If-Generation-Match: 0" -H "time_to_live_sec: 45" --data "some-value"
- Bulk でのインポート専用のエンドポイントも利用可能
まとめ
本稿では永続ストレージ編の第二回目として KVStore 汎用的に様々な用途に活用可能な KVStore を紹介しました。明日はこれまでに紹介した Cache API や永続ストレージのまとめとして、機能比較を通して各機能の使い所のおさらいをしてみたいと思います。
Discussion