Change Data Capture — chaque changement, sous forme de flux
Zaris capture chaque Put et Delete dans l'espace de clés dans un change feed de premier ordre, durable et ordonné. Lisez-le depuis un consommateur OpenChangeFeed, reprenez à partir d'un curseur suivi par le serveur, et gardez vos caches, index, modèles de lecture et systèmes en aval parfaitement synchronisés avec les données.
Un feed ordonné, de nombreux consommateurs
Les écritures affluent dans un feed durable à mesure qu'elles sont appliquées. Des consommateurs nommés y lisent indépendamment, filtrent à la source et mémorisent leur position — de sorte que chaque système en aval reste synchronisé selon son propre rythme.
Quelques lignes vers une projection en direct
- OpenChangeFeed(options, ct)Produit un flux de ChangeEvents publics — la clé, le type d'op (Put/Delete), la valeur et ses métadonnées (dont le TTL), et l'heure d'écriture à la source.
- Reprendre, pas rejouerDéfinissez un ConsumerName durable et le serveur suit votre offset validé — rouvrez et reprenez exactement là où vous vous êtes arrêté, même après un crash ou un déploiement. Aucun commit manuel.
- Filtrer sur le serveurDélimitez le feed par préfixe de clé et type d'opération, pour ne recevoir que les changements qui vous intéressent.
// A durable ConsumerName makes the server track this consumer's committed
// offset and lag — reopen the feed and it resumes automatically.
var options = new ChangeFeedOptions
{
ConsumerName = "search-indexer",
KeyPrefix = "product:", // server-side filter
Kinds = new[] { FeedEventKind.Put, FeedEventKind.Delete },
};
var feed = (IZarisChangeFeedClient)client; // the Zaris client is a feed consumer
await foreach (ChangeEvent e in feed.OpenChangeFeed(options, ct))
{
if (e.IsDelete)
await index.RemoveAsync(e.Key);
else if (e.Value is { } bytes) // raw bytes of a plain-value write
await index.UpsertAsync(e.Key, bytes, e.ExpiresAtUnixMs);
// No manual commit: the named consumer's offset is tracked server-side.
}Pas du pub/sub. Pas une tâche de polling. Un système de référence pour le changement.
Le pub/sub et les Streams sont explicites et éphémères — vous y publiez. Le change feed est implicite et durable : il enregistre ce qui est réellement arrivé à vos données, dans l'ordre, pour quiconque en a besoin.
Capturé automatiquement
Chaque Put et Delete dans l'espace de clés devient un événement de changement ordonné — aucune plomberie applicative, aucune double écriture. Contrairement au pub/sub ou aux Streams, auxquels vous publiez explicitement, le feed est un enregistrement fidèle de ce qui a réellement changé.
Durable et ordonné
Les changements arrivent dans un feed durable et répliqué, dans l'ordre où ils ont été appliqués, de sorte qu'un consommateur qui démarre des heures plus tard voit toujours chaque changement, exactement une fois par curseur, en séquence.
Reprenable, par consommateur
Reprenez à partir d'un offset de consommateur nommé, durable et suivi par le serveur. Chaque consommateur a sa propre position, de sorte qu'un sink lent ne retient jamais les autres — et son retard est visible pour les opérateurs.
Filtré à la source
Restreignez le feed par préfixe de clé et type d'opération sur le serveur, de sorte qu'un consommateur ne reçoive que la tranche qui l'intéresse — moins de travail sur le réseau et dans votre code.
Événements de changement riches
Chaque ChangeEvent porte la clé, le type d'opération, la valeur et ses métadonnées (dont le TTL), et un jeton de curseur — tout ce dont un système en aval a besoin pour appliquer le changement et mémoriser sa position.
Sécurisé et opt-in
Le feed est soumis à autorisation de lecture lorsque la sécurité est activée, et toute la capacité est additive et en opt-in — un store qui n'ouvre jamais de feed n'est absolument pas affecté.
Câblez vos données vers tout ce qui est en aval
Invalidation de cache et CDN
Pilotez une invalidation précise depuis la source de vérité — à l'instant où une clé change, évincez exactement la bonne entrée de cache ou de CDN au lieu de deviner avec des TTL généralisés.
Garder un index de recherche synchronisé
Diffusez les Puts et Deletes directement vers Elasticsearch, OpenSearch ou un vector store, pour que votre index suive les données avec un retard de quelques millisecondes, et non un batch nocturne.
Vues matérialisées et projections
Maintenez des modèles de lecture dénormalisés et des projections CQRS en repliant le flux de changements vers l'avant — reconstruisez-en un depuis le début du feed chaque fois que la forme change.
Journaux d'audit et event sourcing
Persistez une trace ordonnée et durable de chaque mutation pour l'audit, la relecture et la reconstruction à un instant donné — capturée au niveau du store, et non greffée sur chaque service.
Outbox et ETL vers les systèmes en aval
Utilisez le feed comme un outbox fiable : expédiez les changements vers un entrepôt de données, un bus de messages ou un système partenaire sans double écriture ni tâche de polling fragile.
Abonnements d'UI en direct
Diffusez les changements vers les tableaux de bord et les clients pour que les écrans se mettent à jour à l'instant où les données sous-jacentes bougent — sans boucle de polling, sans obsolescence.
Transformez votre store en un flux de changements
Le Change Data Capture est en opt-in et additif — ouvrez un feed là où vous en avez besoin, laissez tous les autres stores intacts.