エッジにデータを保存
多くの場合、AEM Edge関数では、データをエッジに配置し、訪問者に近い場所に配置し、データソースをラウンドトリップすることなく、関数呼び出し全体で再利用する必要があります。 AEM Edge Functionsは、KV ストアを通じてこのエッジデータストレージを提供します。
KV ストアは、実行時に読み取りと書き込みを行うキー値のストアです。 そのデータは関数呼び出しの間に保持されるため、AEM Edge関数コードのどの部分でも、他の部分が以前に書いたものを読み取ることができます。 計算結果のキャッシュ、リダイレクトマップの保持、リクエスト間でのデータ共有に使用できます。
KV ストアを使用するケース
デプロイ時間と読み取り専用に設定したconfigsとは異なり、KV ストアは実行時に読み取りと書き込みが行われます。 1つのkv_default ストアがAEM Edge機能用にプロビジョニングされ、そのモジュールまたはエンドポイントのいずれかが読み取りと書き込みを行うことができます。
configsedgeFunctions.yamlのデプロイ時にconfig_defaultkv_defaultKV ストアを有効にする
kvs: trueをfunctionsの兄弟としてedgeFunctions.yamlのdataに設定します。 このトグルは、AEM Edge機能のkv_default ストアをプロビジョニングします。
# config/edgeFunctions.yaml
kind: "EdgeFunctions"
version: "1"
data:
functions:
- name: my-edge-function
kvs: true # enable the KV store
更新された設定は、Cloud Manager設定パイプラインまたはaio aem rde:install -t env-config ./configを使用してRDEにデプロイします。 詳しくは、AEM as a Cloud ServiceでのAEM Edge関数の設定またはEdge Delivery ServicesでのAEM Edge関数の設定を参照してください。
コードの読み書き
kv_default ストアを開き、get(key)およびput(key, value, options?)に電話してください。 両方の呼び出しは非同期です。 値は文字列として保存されるので、書き込み時にJSON.stringify()を使用してオブジェクトをシリアライズします。 読み取り時に、get(key)によって返されたエントリはtext()、json()、arrayBuffer()を公開するので、entry.json()を呼び出して保存されたオブジェクトを解析します。
// src/index.js or handler file
import { KVStore } from "fastly:kv-store";
// open the KV store
const kv = new KVStore("kv_default");
// write a value (serialize objects to a string)
await kv.put("greeting", JSON.stringify({ text: "Hello from the edge" }));
// read a value (get returns an entry, or null when the key is missing)
const entry = await kv.get("greeting");
const value = entry ? await entry.json() : null;
KV ストアを使用したデータのキャッシュ
一般的なパターンはキャッシュサイドです。 ハンドラーは最初にKV ストアから読み取り、ミスの場合にのみバックエンドを呼び出します。 ttl (秒単位)をput()に渡すと、ストアのエントリが期限切れになるため、有効期限を自分で追跡することはできません。
// src/lib/cache.js
import { KVStore } from "fastly:kv-store";
const kv = new KVStore("kv_default");
// Read a cached value, or null when the key is missing or expired
export async function getCached(key) {
const entry = await kv.get(key);
return entry ? await entry.json() : null;
}
// Cache a value; the store expires it after ttlSeconds
export async function setCached(key, payload, ttlSeconds) {
await kv.put(key, JSON.stringify(payload), { ttl: ttlSeconds });
}
ハンドラーで、キャッシュを読み取り、ミスが発生したときにバックエンドにフォールバックしてから、結果を書き戻します。
let data = await getCached("inventory:west");
if (!data) {
data = await fetchFromBackend();
await setCached("inventory:west", data, 60); // store expires the entry after 60 seconds
}
KV ストアを設定
KV ストアには、edgeFunctions.yamlでのデプロイ時間シードがありません。 関数コードは、実行時にすべての値を書き込みます。 一般的なアプローチには、次のふたつがあります。
- オンデマンド。 上記のキャッシュサイドパターンのように、最初に要求されたときにエントリを入力します。
- メンテナンスエンドポイント経由。 エントリを再構築するエンドポイントを公開してから、スケジュールで呼び出します。 これは、リダイレクトマップなどの大規模で変化の遅いデータセットに適しています。
ガイドライン
- コードを読み取るか書き込む前に、
kvs: trueのストアを有効にします。 - ストアは、すべてのAEM Edge機能コードで共有されます。 キーの名前空間には、
redirect:やinventory:などのプレフィックスを使用します。これにより、異なるモジュールやエンドポイントが競合しません。 - キー名では大文字と小文字が区別されます。
- 値は文字列です。
JSON.stringify()でオブジェクトをシリアル化し、読み取り時に解析します。 - 欠落しているキーを処理します。 キーが存在しない場合、
get()はnullを返します。 - KV ストアは、最終的には一貫性を持ちます。 書き込み直後に、読み取りは前の値を簡単に返すことができるため、クリティカルロジックに対して書き込み後の読み取りに依存することは避けてください。
完全な例
AEM Edge Functionsの例 リポジトリには、完全なconfig/とコードを含むKV ストアの例が含まれています。