Stocker les données à la périphérie

IMPORTANT
AEM Edge Functions est actuellement en version bêta. Les fonctionnalités et la documentation peuvent changer. Pour tout commentaire, contactez 🔗.
NOTE
Les magasins de configuration, de secrets et de KV ne sont pas disponibles dans les programmes Sandbox. Utilisez un environnement autre que Sandbox ou un RDE pour tester un magasin KV.

Une fonction AEM Edge a souvent besoin de conserver les données à la périphérie, à proximité de vos visiteurs, et de les réutiliser entre les appels de fonction sans aller-retour vers l’origine. Les fonctions AEM Edge fournissent ce stockage de données Edge par le biais d’un magasin KV.

Un KV store est un magasin de valeurs clés que vous lisez et écrivez au moment de l’exécution. Ses données persistent entre les appels de fonction, de sorte que toute partie de votre code de fonction AEM Edge puisse lire ce qu’une autre partie a écrit précédemment. Utilisez-le pour mettre en cache les résultats calculés, contenir des mappages de redirection ou partager des données entre les requêtes.

Quand utiliser un KV Store

Contrairement à configs, que vous définissez au moment du déploiement et en lecture seule, un magasin KV est en lecture et en écriture au moment de l’exécution. Un magasin de kv_default est configuré pour votre fonction AEM Edge et tous ses modules ou points d’entrée peuvent y lire et y écrire.

configs
KV store
Accès
Lecture seule au moment de l’exécution
Lecture et écriture au moment de l’exécution
Défini par
Vous, au moment du déploiement en edgeFunctions.yaml
Votre code de fonction au moment de l’exécution
Nom de la boutique
config_default
kv_default
Utiliser pour
Paramètres statiques par environnement
Données qui changent au moment de l’exécution

Activer le KV store

Définissez kvs: true sous data dans edgeFunctions.yaml, comme frère de functions. Ce bouton (bascule) approvisionne le magasin de kv_default pour la fonction AEM Edge.

# config/edgeFunctions.yaml
kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  kvs: true # enable the KV store

Déployez la configuration mise à jour via le pipeline de configuration Cloud Manager ou avec aio aem rde:install -t env-config ./config sur un RDE. Voir Configuration des fonctions AEM Edge sur AEM as a Cloud Service ou Configuration des fonctions AEM Edge sur Edge Delivery Services pour plus d’informations.

Lecture et écriture dans le code

Ouvrez le magasin de kv_default, puis appelez get(key) et put(key, value, options?). Les deux appels sont asynchrones. Les valeurs sont stockées sous forme de chaînes, donc sérialisez les objets avec des JSON.stringify() à l’écriture. Lors de la lecture, l’entrée renvoyée par get(key) expose text(), json() et arrayBuffer(). Par conséquent, appelez entry.json() pour analyser un objet stocké.

// 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;

Mettre en cache des données avec un KV Store

Un modèle courant est le cache-side. Le gestionnaire lit d’abord le magasin KV et appelle le serveur principal uniquement en cas d’échec. Transmettez une ttl (en secondes) à put() et le magasin fait expirer l’entrée pour vous, afin que vous ne puissiez pas suivre l’expiration vous-même.

// 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 });
}

Dans un gestionnaire , lisez le cache, revenez sur le serveur principal en cas d’échec, puis réécrivez le résultat.

let data = await getCached("inventory:west");
if (!data) {
  data = await fetchFromBackend();
  await setCached("inventory:west", data, 60); // store expires the entry after 60 seconds
}

Renseigner la boutique KV

Le magasin KV n’a pas d’amorçage au moment du déploiement en edgeFunctions.yaml. Votre code de fonction écrit chaque valeur au moment de l’exécution. Deux approches courantes sont les suivantes :

  • À la demande. Renseignez une entrée la première fois qu’elle est demandée, comme le fait le modèle de mise en cache ci-dessus.
  • Via un point d’entrée de maintenance. Exposez un point d’entrée qui reconstruit les entrées, puis appelez-le selon un planning. Cela convient aux jeux de données volumineux et à évolution lente tels que les cartes de redirection.

Directives

  • Activez le magasin avec kvs: true avant que votre code ne le lise ou ne l’écrive.
  • Le magasin est partagé par tout votre code de fonction AEM Edge. Mettez vos clés dans un espace de noms avec un préfixe, tel que redirect: ou inventory:, afin que différents modules ou points d’entrée n’entrent pas en conflit.
  • Les noms clés respectent la casse.
  • Les valeurs sont des chaînes. Sérialisez les objets avec JSON.stringify() et analysez-les lors de la lecture.
  • Gérer une clé manquante. get() renvoie null lorsque la clé n’existe pas.
  • Un magasin KV finit par être cohérent. Juste après une écriture, une lecture peut renvoyer brièvement la valeur précédente, évitez donc de dépendre de la lecture après écriture pour une logique critique.

Exemple complet

Le référentiel Exemples de fonctions AEM Edge comprend un exemple de magasin KV avec un config/ et un code complets :

Exemple
Référentiel
Ce que cela démontre
Recherche de carte de redirection
publish-delivery-redirect-maps
Lit les cibles de redirection du magasin KV à la demande, reconstruit les entrées de carte partagées via un point d’entrée de maintenance et retourne à l’origine en cas d’échec

Ressources supplémentaires

recommendation-more-help
experience-manager-learn-help-cloud-service