Fenêtres & agrégations
Vous allez construire : un stage streaming qui compte et profile les événements par clé dans une fenêtre glissante — la primitive derrière la vélocité de fraude, la santé de flotte et les dashboards temps réel.
Prérequis
- Être à l'aise avec l'anatomie de pulse.yaml.
1 · Générez avec un stage streaming
pulse new velocity --source webhook --stage streaming:window5
2 · Déclarez la fenêtre
stages:
- name: window5
engine: streaming
operators:
- { type: keyBy, field: user_id }
- type: window
spec: "sliding(5m,1m)"
aggregations:
events: "count()"
total: "sum(amount)"
big_ones: "countWhere(amount > 100)"
spread: "stddev(amount)"
Deux opérateurs : keyBy donne à chaque user_id sa propre fenêtre indépendante, puis window déclare la forme. Les specs de fenêtre : tumbling(60s) · sliding(60s,10s) · session(30s) · count(100) · count_sliding(100,10) · global(). La palette d'agrégateurs : count() · sum · min · max · avg · first · last · stddev · countWhere(expr) · sumWhere(expr). La spec et chaque agrégation sont validées au deploy — une faute de frappe est une erreur nommée, pas un no-op silencieux.
3 · Déployez et envoyez une rafale
pulse secret set PULSE_WEBHOOK_SECRET dev-secret # la source webhook générée l'exige
pulse deploy .
for i in 1 2 3 4 5; do
pulse events publish --topic velocity.in --value '{"user_id":"u1","amount":'"$((i*40))"'}'
done
4 · Observez les agrégats
pulse events tail --topic velocity.window5.out
Les événements d'agrégat pour la clé u1 : events grimpe de 1 à 5, total s'accumule, big_ones compte les envois >100, spread (stddev) s'élargit à mesure que les montants divergent.
5 · Prouvez l'isolation
pulse events publish --topic velocity.in --value '{"user_id":"u2","amount":10}'
u2 démarre sa propre fenêtre à 1 événement — les chiffres de u1 sont intacts. L'état par clé est par clé, toujours.
Ce qui vient de se passer
Vous avez déclaré du traitement de flux avec état sans écrire de code d'état. Le moteur maintient des fenêtres par clé, applique la sémantique event-time avec des watermarks (les événements en retard ne corrompent pas silencieusement la fenêtre — les vrais retardataires partent en dead-letter queue), et émet les agrégats en aval comme n'importe quel événement. Chaînez un stage rule-based derrière et vous avez un détecteur.
Dépannage
Aucun agrégat en sortie
Vérifiez que le nom du stage dans votre commande tail correspond au YAML (velocity.window5.out). Les agrégats s'émettent au fil des mises à jour de la fenêtre — envoyez plus d'un événement.
Le deploy rejette ma spec de fenêtre
La spec fenêtre/agrégation est validée au deploy — l'erreur nomme le champ. Vérifiez l'orthographe de l'agrégateur contre la palette de l'étape 2.