Aller au contenu principal

Joins stream-stream — la commande rencontre l'expédition

Intermédiaire ⏱ 15 min streaming · join · corrélation

Vous allez construire : un pipeline qui joint les commandes à leurs expéditions dans une fenêtre de 5 minutes — la primitive derrière l'appariement commande↔paiement, la corrélation alerte↔acquittement et la détection de trous dans la supply chain.

orders + shipments → streaming:match → (paires appariées en sortie)

Prérequis

1 · Générez une app avec un stage streaming

pulse new fulfillment --source webhook --stage streaming:match

2 · Déclarez le join

stages:
- name: match
engine: streaming
operators:
- type: join
leftTopic: fulfillment.in
rightTopic: shipments
on: orderId
window: "5m"
joinType: inner # inner · left · right · full

Le join apparie chaque événement de gauche avec les événements de droite partageant la même clé on, tant que les deux arrivent dans la fenêtre. Vous ne câblez le second topic nulle part ailleurs — déclarer le join abonne automatiquement le stage au rightTopic.

3 · Déployez et alimentez les deux côtés

pulse secret set PULSE_WEBHOOK_SECRET dev-secret # la source webhook générée l'exige
pulse deploy .
pulse events publish --topic fulfillment.in --value '{"orderId":"o-42","item":"drone","amount":249}'
pulse events publish --topic shipments --value '{"orderId":"o-42","carrier":"dhl","tracking":"T-981"}'

4 · Regardez la paire sortir

pulse events tail --topic fulfillment.match.out

Un événement joint pour o-42, portant les champs des deux côtés — la commande et son expédition, corrélées en vol.

5 · Faites des absences le signal

joinType: left

Avec un join left, une commande qui ne rencontre jamais d'expédition dans la fenêtre émet quand même — avec le côté droit vide. Chaînez un stage rule-based sur « expédition manquante » et vous avez construit la détection expédié-mais-jamais-scanné : les trous sont les alertes.

Ce qui vient de se passer

Vous avez corrélé deux flux d'événements indépendants déclarativement — pas de consumer groups, pas de code de state store, pas de batch de réconciliation. La fenêtre borne la mémoire et définit le retard ; le type de join décide si les correspondances, les absences ou les deux coulent en aval.

Dépannage

Aucun événement joint n'apparaît

Vérifiez que le champ on existe dans les deux payloads avec des valeurs identiques, et que les deux événements ont été envoyés dans la fenêtre. pulse events tail --topic shipments confirme que le côté droit a bien atterri.

Le deploy rejette l'opérateur

leftTopic, rightTopic et window sont requis ; joinType doit être inner | left | right | full. Le validateur nomme le champ fautif.

Ensuite