ediverse Explorer la plateforme

À la une PEPPOL BIS Billing 3.0 L’obligation européenne d’e-invoicing arrive : France sept 2026, Belgique janv 2026, Allemagne 2025.

Selective Consumer

Le filtrage côté queue plutôt que côté code — pour éviter qu'un consumer ne tire 1000 messages pour en jeter 999.

Problème

Une queue commune transporte des messages destinés à plusieurs consumers selon un critère (partenaire, type, environnement). Un consumer naïf tire tout et filtre en code — gaspillage de bande passante et de CPU.

Forces

  • Une seule queue est souvent imposée par le broker EDI partagé ; on ne peut pas créer une queue par consumer.
  • Tirer puis jeter consomme la lock du message, bloque les autres consumers et gonfle le commit log.
  • Le filtrage côté queue ne s'applique que sur les headers / properties, pas sur le payload chiffré.
  • Un selector inadapté peut faire stagner un message si aucun consumer ne le matche.

Solution

Configurer le consumer avec un selector côté broker. Sous JMS, le selector est une expression SQL-like sur les headers (`AS2_PARTNER = 'WALMART' AND DOC_TYPE = 'ORDERS'`). Sous Kafka, on s'appuie sur des partitions par clé et un filtre Streams. Sous RabbitMQ, on utilise un binding key sur un topic exchange. Le résultat : chaque consumer ne reçoit que ses messages, sans pull-and-drop.

Implémentation EDI

En EDI, le Selective Consumer est utilisé pour séparer les traitements par partenaire (un consumer par grand donneur d'ordre Walmart / Target / Amazon) sans dupliquer la queue. Les headers sont peuplés par le AS2 Gateway au moment de l'ingestion : `AS2_FROM`, `AS2_TO`, `DOC_TYPE`. Les consumers Camel s'abonnent avec un `selector='DOC_TYPE = ORDERS'`. Attention à ne pas reposer sur des headers non garantis (le partenaire peut omettre `AS2_FROM` dans certaines flow signed-only).

Anti-patterns

  • Selector trop large qui matche tout — le pattern dégénère en pull-and-drop déguisé.
  • Selector qui dépend du payload (impossible côté broker) — confondu avec un Message Filter applicatif.
  • Selectors qui se recouvrent entre consumers — un même message tiré deux fois.
  • Selectors qui se complètent pas (no consumer matches) — message bloqué jusqu'à TTL ou DLQ.

Patterns liés

Sources