Memory: persistent KV store

memory_note · action · Utility · Disponibile · v1.0.0

Descrizione

Storage enterprise chiave-valore persistente scoped per workflow — la primitiva per implementare workflow stateful che devono ricordare dati cross-run tra esecuzioni successive del stesso workflow (cursor di paginazione di sync incrementali, contatori di retry, flag di "già processato" per idempotency, baseline KPI per detection di drift, timestamp di "ultima esecuzione" per cron skip-if-recent logic). Implementazione robusta su SQLite per-tenant del runtime, table dedicata `workflow_memory` con isolation rigorosa per workflow_id — workflow diversi NON si vedono tra loro (gli engineer principle di least privilege + memoria privata per workflow per evitare leak di state tra contesti separati e comportamenti emergenti debugging-difficili). Cinque operazioni atomiche coprono tutti i pattern stateful necessari: (1) get — legge il valore associato a una key; se la key non esiste ritorna value=null ed exists=false (pattern safe check-before-use), oppure il valore di default se configurato (usedDefault=true); (2) set — scrive (o sovrascrive se esiste) il valore della key, valore può essere qualsiasi JSON serializzabile (string, number, boolean, array, object nested fino a 1MB cap per safety); (3) append — concatena il valore a una stringa esistente con un separator configurabile (default newline), crea la key se non esiste (pattern naturale per log accumulato di righe); (4) delete — rimuove la key (idempotent: delete su key inesistente = no-op); (5) list — restituisce l'elenco delle key esistenti per il workflow corrente, con filtro pattern glob opzionale (es. "cursor:*" → tutte le key che iniziano con "cursor:"; * = molti char, ? = un char) (output keys[] + count + pattern). TTL opzionale per auto-cleanup: ogni key può avere un TTL in secondi; la pulizia è LAZY al prossimo get (una key scaduta viene cancellata e ritorna exists=false) — pattern utile per cache time-limited (es. "deduplica notify per 24h" → key con TTL 86400s) senza dover gestire manualmente la cleanup logic. Concurrency: le operazioni sono atomic (SQLite transaction per write), in caso di concurrent run dello stesso workflow (es. due trigger_webhook simultanei), le scritture sono serialized — no race condition su counter increment (l'idiom get → modify → set è race-prone, raccomandato pattern dedicated atomic increment se servisse). Output: { value, exists, updatedAt, expiresAt (timestamp scadenza o null), operation, usedDefault (get), oldValue e changed (set, per audit del cambio), keys[] + count + pattern (list) }. Use case: memorizzare cursor di paginazione di una sync incrementale (es. "last_synced_at" per next iteration del cron, evita ri-fetch dei dati già processati); contatore tentativi retry distribuito su run cron schedulati (retry_count++ ogni fail, reset al success); flag "già notificato" per evitare doppi alert su stesso evento ricorrente (key "alerted:incident:XYZ" con TTL 24h); timestamp ultima esecuzione per cron skip-if-recent logic (se < 5min fa, skip questo tick); budget spese API mensili (cumulative cost tracking per quota enforcement custom oltre quelle del piano); accumulo di list di errori per batch summary email digest a fine giornata.

⚙️ Parametri di configurazione

Campi mostrati nell’editor quando si configura il nodo. Generati direttamente dal NodeDefconfigFields.

CampoTipoRequiredDefaultDescrizione
operation
Operazione
enum
getsetappenddeletelist
sigetget = leggi valore. set = scrivi/sovrascrivi. append = aggiungi a stringa. delete = rimuovi. list = lista tutte le key di questo workflow.
key
Chiave
expressionno
last_pagination_cursor
Identifier univoco per workflow (snake_case raccomandato). Required per get/set/append/delete. Ignorato per list.
value
Valore (per set/append)
expressionno
{{$node.lastPage.json.cursor}}
Valore da scrivere. Object → serializzato JSON. Required per set/append. Per append: viene aggiunto in coda al valore esistente (con separator se configurato).
default
Valore di default (solo get)
expressionno
es. 0 oppure {{input.fallback}}
Se la key NON esiste, get ritorna questo valore (exists resta false, usedDefault=true). Vuoto = ritorna null.
pattern
Filtro pattern (solo list)
stringno
es. cursor:*
Glob opzionale per filtrare le key: * = molti caratteri, ? = un carattere. Es. "cursor:*" elenca solo le key che iniziano con "cursor:". Vuoto = tutte le key.
appendSeparator
Separator (solo append)
stringno\nDefault "\n" (newline). Usato SOLO se operation=append e key esiste gia\`. Es. "," → "a,b,c". Empty → concat puro.
ttlSeconds
TTL secondi (auto-delete)
numberno
86400
Opzionale. Quando settato, la key scade dopo N secondi dall'ultimo write. Cleanup avviene lazy al prossimo read (key scaduta → output.exists=false, row deleted).

⬆️ Output del nodo

Campi disponibili nei nodi successivi via $node.<alias>.json.<field>:

  • value
  • exists
  • updatedAt
  • expiresAt
  • usedDefault
  • oldValue
  • changed
  • keys
  • count
  • pattern
  • operation

💡 Esempio configurazione

Snippet JSON del nodo come compare nel workflow. I valori sono derivati daidefaultValue e dai parametri required.

{
  "id": "node-memory_note-1",
  "defId": "memory_note",
  "label": "Memory: persistent KV store",
  "config": {
    "operation": "get",
    "appendSeparator": "\\n"
  }
}

🔗 Nodi correlati nella stessa categoria

Pronto a usare Memory: persistent KV store?

Disponibile da subito in tutti i piani FlowForge. Provalo gratis senza carta di credito.

Inizia gratisSfoglia tutti i nodi