Fastly Compute 永続ストレージへの読み書き (3) KV Store の最新情報(2024年末版)
この記事は Fastly Compute 一人アドベントカレンダー 2024 11 日目の記事です。
今年は KV Store について大きめのリリースが 2 つありました。1 つ目は 6 月に無料枠が新設されたことで、本稿執筆時点(2024年12月現在)で開発者アカウントにおいて 1 GB分のストレージ無料枠が提供開始されたため、とりあえずお試しでの利用開始が簡単にできるようになりました。2 つ目が本稿で紹介する、Compute から利用できる機能を増やすための SDK の改善です。
本稿では永続ストレージ編の第三回目として、この改善内容について少し掘り下げて紹介します。
おさらい: SDK に不足していた機能
前回の KV Store の解説では以下のようなコード例を紹介しました。
# 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')
いかにもちゃんと書けそうで、実際 KV Store のエントリを読みにいくとか、単純にエントリを追加したりするだけであれば不足はありませんでした。一方で REST で提供されている API に比べて、 Compute からアクセスできる機能に不足がある点についても前回の記事の「API アクセスの特徴と長所」章で簡単に触れていて、以下のように記載していました。
- KV Store 作成時にストアのロケーションとして "US", "EU", "ASIA", "AU" のいずれかを選択指定可能
- KV Store のエントリの書き込み時に TTL 指定と重複書き込みの防止が可能
- Bulk でのインポート専用のエンドポイントも利用可能
今回の SDK への機能追加では、上記のうち 2 点目のエントリの書き込み時に TTL 指定と重複書き込みの防止等細かなコントロールができるようになった他、これまではできなかった KV Store エントリ一覧の取得も可能になっています。特に後者のエントリ一覧の取得が API 経由でのみ提供されて SDK 経由では実行できなかったのは個人的 KV Store のつらい点の上位に入っていたので(都度 REST API の呼び出しをする必要がこれでなくなりました)、これが解消されたことは個人的にビッグニュースでした。
Rust SDK 0.11.0 で追加された API 群
具体的にどのような API が追加されたかドキュメントを眺めてみます。 fastly::kv_store
の docs を読むと違いが正確に分かるのでリンクを貼っておきます。
- 0.10.5 の docs https://docs.rs/fastly/0.10.5/fastly/kv_store/index.html
- 0.11.0 の docs https://docs.rs/fastly/0.11.0/fastly/kv_store/index.html
0.10.5 では KVStore 構造体のみ定義されていましたが、0.11.0 では構造体の数だけで言うと 13 個に増えています
- DeleteBuilder
- InsertBuilder
- KVStore
- ListBuilder
- ListPage
- ListResponse
- LookupBuilder
- LookupResponse
- PendingDeleteHandle
- PendingInsertHandle
- PendingListHandle
- PendingLookupHandle
- StoreHandle
上記のうち処理の基点となるのが *Builder と命名された構造体で、その他の Pending* や *Page, *Response といった構造体はそれに付随して必要になる構造体です。ここでは各 Builder の機能についてサンプルコードを交えて動作を見ていきます。
InsertBuilder
0.10.5 までは insert()
または insert_async()
メソッド呼び出しにより単純に Key と Value の値を保存することのみ可能でしたが、0.11.0 から以下のようにメソッドチェーンで挿入処理に必要なパラメータをセット可能になっています。
store.build_insert()
.mode(InsertMode::Prepend) // Overwrite, Add, Append, Prepend から選択
.background_fetch() // バックグラウンドで挿入処理を実行、stale content による処理結果の早期取得を可能に
.if_generation_match(1337) // 重複書き込み防止のための if-generation-match を利用
.metadata("2000B of arbitrary data") // メタデータの書き込み
.time_to_live(std::time::Duration::from_secs(5)) // TTL の設定
.execute("key1", "value1")?;
ListBuilder
InsertBuilder と同じく、0.10.5 では指定できなかった各種パラメータがメソッドチェーンを通して設定可能になっています。
store.build_list()
.eventual_consistency() // 取得速度は落ちるが一次データソースからの取得して強整合で取得
.cursor("dXNlcjpVMEc5V0ZYTlo=") // カーソルによる一覧の取得開始地点セット
.limit(100) // リストに含まれる要素数の設定(最大1,000)
.prefix("") // 取得する key の接頭辞の指定
.execute()?;
LookupBuilder と DeleteBuilder
Lookup と Delete については 0.10.5 時点でも機能的に不足はありませんでしたが、記述スタイルを Insert と List に合わせる形で Lookup と Delete についても同様のメソッドチェーンでの記法で実装するようにインターフェースが変更になっています。
store.build_lookup()
.execute("key1")?;
store.build_delete()
.execute("key1")?;
まとめ
本稿では KV Store で昨年時点では不足していた API について、今年追加された内容について概要をお話しました。この変更によって一般的な永続化データを伴う開発がより実装しやすくなり個人的には今年一押しの更新内容となっています。これで Rust だと以前よりもブログや CMS のようなエントリの一覧を取得する必要がある仕組みを実装するのもかなり楽になりましたし、Go や JavaScript SDK への今後の同様の機能追加も期待したいところです。
次回は今年新機能が数多くリリースされた Fastly Compute の セキュリティ系機能のうち、Edge Rate Limiting について概要や使い方を紹介します。
Discussion