Craft Key-Value Store にデータを保存する
Craft Key-Value Store (Craft KVS) はCraft Functions内で利用できるKey Value Storeです。
Craft Functionsの MODULES.kvs
から利用します。
KVSの構造
Craft KVSのレコードはkey
と value
からなります。
key
- KVSのユニークなキーです
- KARTEプロジェクト単位でユニークなキーとなります。
MODULES.kvs
上はstring型の値として扱います- マルチバイト文字は利用できません
- KVSのユニークなキーです
value
- KVSのキーに紐づく値です
MODULES.kvs
では一般的なオブジェクトとして扱います。
また、Craft KVSのレコードは管理用の情報として created_at
, expired_at
フィールドを持ちます。
created_at
- レコードの作成/更新時刻です。
- 書き込み系のメソッドを実行したタイミングで自動的に付与されます。
- レコードを更新(上書き)した場合、
created_at
フィールドも更新されます。
- レコードを更新(上書き)した場合、
expired_at
- レコードの有効期限です。
- 書き込み系のメソッドで指定します。
expired_at
の時刻を超えたレコードは、通常72時間以内にKVSが自動で削除します。
サンプルコード
メソッド
kvs
モジュールで利用できるメソッドについて説明します。
write
storeにデータを書き込みます。
1 valueあたり 1KB の制限があります。
minutesToExpire
で何分後にexpireするか指定することが出来ます。minutesToExpire
を指定しない場合はTTLはデフォルトで1 dayです。
minutesToExpire
の上限は、通常のプランでは現在時刻から1 month(44,640min)までです。これを超える値を指定したい場合は、プレイドの営業・カスタマーサクセスにお問い合わせください。
get
storeからデータを読み取ります。
なお、TTLによるレコードの自動削除は expired_at
で指定した時刻から72時間後までの間に行われるため 、expired_at
に過去の値を持つデータを取得することがあります。
delete
storeからデータを削除します。
checkAndWrite
created_at
fieldに対する条件を照らしてから、その結果に応じて条件付き書き込みができます。
operator
は、 =, <, <=, > , >=
から指定できます。
unixtimeMs
は const unixtimeMs = new Date().getTime()
のように millisecond で指定ください。
条件判定では、created_at
, operator
, unixtimeMs
の関係が以下となる場合に書き込みを行います。
例えばoperatiorに ‘<’
を指定した場合、 created_at
が unixtimeMs
より小さい場合に値を書き込みます。
レコードが現在時刻の5分前よりも前に作成・更新された場合にのみ上書きするには、次の条件式になるように引数を設定します。
この時のメソッド呼び出しは次のようになります。
なお、TTLの挙動はwrite methodと同じです。
checkAndWriteのエラーハンドリング
throwされるerrorオブジェクトのstatus
というフィールドに次のステータスコードが代入されます。要件に応じてretryの処理を入れてください。
- status: 404
- writeメソッド、checkAndWriteメソッドにおいて、条件に合致するデータが存在せず、値が更新されなかった場合に返却されます。
- データ自体が存在しない場合、このerrorは発生せずwriteが成功します。
- status: 409
- 同時に同じキーが更新されたので更新されなかった
- status: 400
- その他のバリデーションエラーなど
- status: 500
- Internal Error
サンプルデータ
- 自動で
[key名].value
というパスが間に入ります。
制限
1 valueあたり 1KB の制限があります。
API リファレンス
注意点
ホットスポットの発生によるパフォーマンス低下
keyの辞書順が近いレコード群に対して頻繁に読み取りや書き込みを行うと、ホットスポットの発生により一時的にパフォーマンス低下することがあります。
この問題は、keyに対して辞書順をばらけさせるためのprefixを付与することで軽減できる可能性があります。
FAQ
Q. KVSはどの単位で共有されますか?
- プロジェクト単位で1つのKVSが共有されます。
- 複数のFunctionで同じデータが参照できてしまいます。
- Function単位でnamespaceを厳密に管理してください。
Q. すでに存在するkeyに対してwriteをした場合はどうなりますか?
- 既存のレコードが上書きされます
- 内部的には新しくレコードが作り直される形になり、created_atも最新の時刻で更新されます
Q. レコードの有効期限(minutesToExpire
)を指定せずにレコードを永続化できますか?
minutesToExpire
を設定せずにレコードを書き込んだ場合は、永続化されるのではなく上述した「デフォルトの有効期限」が設定されますminutesToExpire
に設定できる値の上限は契約プランによって異なりますが、仮に設定値の上限が無いプロジェクトであっても、有効期限を長く設定したい場合はminutesToExpire
を明示的に指定する必要があります- その場合、
minutesToExpire
を1000年後 (約525,600,000分後) など遠い未来の値に指定することで、実質的にレコードの永続化が可能です
- その場合、