Aller au contenu principal

Fenêtres & agrégations

Intermédiaire ⏱ 15 min streaming · 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.

webhook → streaming:window5 → (agrégats fenêtrés en sortie)

Prérequis

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.

Ensuite