flexway
FRENParler à un expert

Asynchrone

Le monde asynchrone, derrière les mêmes portes.

Publier sur Kafka, AMQP ou MQTT depuis HTTP, sous contrat AsyncAPI, avec la même identité et les mêmes quotas que le reste ; des webhooks sortants signés et rejouables.

8 livrées sur les 9 présentées · depuis v1.5.0

Ce que vous attendez de ce domaine

  • Contrôler les commandes descendantesCommandes Sparkplug sous portée déclarée prévues ; la condition sur l'état courant du système : candidatEn partie · suite en 1.7
  • Données hors plage des dispositifsBornes minimum et maximum du schéma sur les charges validées ; les règles cliniques restent au serviceEn partie · suite à dater
  • Irrigation, machines : boucle IA -> commande physiqueCommande autorisée par portée (1.7.0) ; condition sur l'état réel : candidat ; les sécurités physiques restent indépendantesEn partie · suite à dater
Toutes les attentes du marché
Portes asynchrones du cataloguePortes asynchrones du catalogue
Les portes asynchrones vivent dans le catalogue, à côté des routes REST : l'une publie vers un sujet, l'autre reçoit les événements.Capture réelle, données de démonstration · v1.6.3

Ce que ça résout

Problème 1

Chaque équipe ouvre son courtier

Des producteurs branchés directement sur Kafka, sans contrat ni quota.

Réponse de Flexway : Un canal n'existe que s'il est déclaré dans l'AsyncAPI ; la publication passe par la passerelle.

Problème 2

La frontière synchrone casse

Un client HTTP attend une réponse qu'un consommateur traitera plus tard.

Réponse de Flexway : La passerelle répond 202 avec un identifiant et publie en enveloppe CloudEvents.

Problème 3

Un webhook se perd ou se falsifie

Le destinataire ne peut ni vérifier l'origine ni rejouer.

Réponse de Flexway : Webhooks signés, rejouables, sous le même audit.

Fonctionnement

Chaque étape est une décision lisible dans la trace et dans la console.

Votre infrastructureflexwayPasserelle API, IA et agentsChaîne de décision unifiéecanal non déclaré : refus01 Contrat02 Identité03 Quota04 Enveloppe05 Courtier06 RéponseApplications HTTPPartenairesKafkaAMQP, MQTTWebhooksVotre infrastructureflexwayPasserelle API, IA et agentsChaîne de décision unifiée01 Contratcanal déclaré dans l'AsyncAPI02 Identitécomme pour REST03 Quotapar appelant04 EnveloppeCloudEvents 1.005 CourtierKafka, AMQP, MQTT06 Réponse202 et identifiantApplications HTTPPartenairesKafkaAMQP, MQTTWebhooks

Asynchrone - Schéma du domaine : qui appelle, les étapes de décision, ce qui est appelé, et le cas de refus.

  • Applications HTTP
  • Partenaires
  1. Contrat
  2. Identité
  3. Quota
  4. Enveloppe
  5. Courtier
  6. Réponse
  • Kafka
  • AMQP, MQTT
  • Webhooks

canal non déclaré : refus

Applications HTTP
Les applications qui appellent vos API : chaque requête passe par Flexway, qui vérifie le contrat et l'identité avant d'atteindre vos systèmes.
Partenaires
Les entreprises partenaires qui consomment vos API : identifiées par certificat client ou clé d'API, sous un quota par tenant.
Contrat
Le canal doit être déclaré dans le contrat AsyncAPI ; un canal non déclaré est refusé avant toute publication.
Identité
Flexway vérifie qui appelle (jeton OIDC, clé d'API ou certificat client) et lit le tenant dans l'identité ; sans identité valide : 401.
Quota
Un seau à jetons par appelant limite son débit ; au-delà : 429 avec Retry-After et les en-têtes RateLimit.
Enveloppe
Le message est posé dans une enveloppe CloudEvents 1.0, pour que tout consommateur le lise de la même façon.
Courtier
Flexway publie le message sur votre courtier Kafka, AMQP ou MQTT, en client de ce courtier.
Réponse
L'appelant reçoit 202 avec un identifiant : le message est accepté, la suite est asynchrone.
Kafka
Votre cluster Kafka : Flexway y publie les événements reçus en HTTP, sous contrat, en enveloppe CloudEvents.
AMQP, MQTT
Vos courtiers AMQP et MQTT : Flexway y publie en client du courtier, sous contrat AsyncAPI.
Webhooks
Les systèmes de vos partenaires : ils reçoivent vos événements en webhooks signés et rejouables.
  • Ligne : un trajet
  • Correspondance : décision partagée
  • Événement
  • Refus
  • Votre infrastructure
  1. Contratcanal déclaré dans l'AsyncAPI
  2. Identitécomme pour REST
  3. Quotapar appelant
  4. EnveloppeCloudEvents 1.0
  5. CourtierKafka, AMQP, MQTT
  6. Réponse202 et identifiant

En détail

L'essentiel de chaque sujet, avec son statut dans la version publiée ; dépliez une carte pour le texte complet.

AsyncAPI comme contrat du plan asynchrone

Livré · v1.5.0

Le plan asynchrone a son contrat AsyncAPI 3.0 ou 3.1 : ce qui est publié ou consommé est exactement ce qui est déclaré, vérifié au chargement.

  • AsyncAPI 3.0 et 3.1, schéma officiel embarqué
  • Publié ou consommé = déclaré
  • Portes HTTP x-flexway-publish et x-flexway-subscribe
Voir le détailMasquer le détail - AsyncAPI comme contrat du plan asynchrone

Le plan asynchrone a son contrat, exactement comme le synchrone a l'OpenAPI : contracts.asyncapi charge un AsyncAPI 3.0.0 ou 3.1.0, validé contre le schéma officiel embarqué. Les canaux, leurs messages et leurs schémas viennent du contrat ; une opération send ou receive nomme son courtier par x-flexway-upstream. La porte HTTP est une opération OpenAPI marquée x-flexway-publish ou x-flexway-subscribe.

L'invariant reste le même : publié ou consommé = déclaré. Une opération sans courtier, une porte vers une opération absente ou de l'autre sens, un corps d'un autre schéma que le message ou un message sans schéma JSON (Avro, Protobuf) sont refusés au chargement, tous rapportés d'un coup. Un refus est dit, jamais ignoré.

Tous les points

  • AsyncAPI 3.0 et 3.1, schéma officiel embarqué
  • Publié ou consommé = déclaré
  • Portes HTTP x-flexway-publish et x-flexway-subscribe
  • Erreurs de contrat rapportées au chargement

Fonctionnalités et statut

  • AsyncAPI comme source du plan asynchroneLivré · v1.5.0
Lire dans la documentation : Plan asynchrone et courtiers

Publier depuis HTTP : 202 après l'accusé du courtier

Livré · v1.5.0

Un client HTTP publie sans client de courtier : le corps est validé, enveloppé en CloudEvents, et la passerelle ne répond 202 qu'après l'accusé du courtier.

  • Corps validé contre le schéma du message
  • 202 seulement après l'accusé du courtier
  • Tampon borné : 503 immédiat plutôt qu'une file sans fin
Voir le détailMasquer le détail - Publier depuis HTTP : 202 après l'accusé du courtier

Un client HTTP, ou un agent par un outil MCP, publie sans embarquer de client de courtier. Le corps est lu en entier dans une borne, vérifié contre le schéma du message, puis enveloppé en CloudEvents 1.0 en mode binaire (structuré sur MQTT 3.1.1). La passerelle répond 202 seulement après l'accusé du courtier : acks=all d'un producteur Kafka idempotent, confirmation AMQP, PUBACK MQTT en QoS 1. Une Idempotency-Key devient l'id de l'évènement, et idempotency: required l'exige (428 sinon).

Le tampon est borné par courtier et par réplique (max_in_flight, 1 024 par défaut) : au-delà, 503 overloaded immédiat, jamais une file qui grossit avec la panne. Un coupe-circuit par courtier donne 503 upstream_unavailable ; un dépassement de budget donne 504 upstream_timeout, qui signifie issue inconnue.

La passerelle s'authentifie au courtier (SASL, mTLS, secrets par référence) ; l'appelant voyage en attributs CloudEvents - tenant toujours, traceparent, authid et authtype seulement si le message les déclare - et un en-tête ce-* fourni par l'appelant est refusé (400). Un message publié par une route REST porte la même ligne d'audit et le même verdict d'autorisation qu'un appel synchrone.

Tous les points

  • Corps validé contre le schéma du message
  • Enveloppe CloudEvents 1.0
  • 202 seulement après l'accusé du courtier
  • Tampon borné : 503 immédiat plutôt qu'une file sans fin

Fonctionnalités et statut

  • Publication Kafka sous contrat, enveloppe CloudEventsLivré · v1.5.0
  • Médiation de la frontière synchrone vers asynchroneLivré · v1.5.0
  • Projection vers gRPC et vers un message de courtierLivré · v1.5.0
Lire dans la documentation : Publier et s'abonner

Consommer en SSE ou en WebSocket, isolé par tenant

Livré · v1.5.0

Navigateurs et mobiles consomment un flux en SSE ou en WebSocket sans parler le protocole du courtier, chaque abonné ne recevant que ce que nomment ses valeurs vérifiées.

  • SSE en éventail, reprise par Last-Event-ID
  • WebSocket au moins une fois, acquittement explicite
  • Isolation par valeurs vérifiées, jamais par le contenu
Voir le détailMasquer le détail - Consommer en SSE ou en WebSocket, isolé par tenant

Un navigateur ou un mobile consomme un flux sans parler le protocole du courtier. En SSE, la diffusion est en éventail : un consommateur par canal et par réplique, quel que soit le nombre d'abonnés ; la reprise se fait par Last-Event-ID depuis l'historique en mémoire du canal (history, 64 par défaut), avec 412 au-delà. En WebSocket, la livraison est au moins une fois : la position n'avance qu'après {"ack": "<id>"}, sinon la connexion est fermée après ack_timeout et le message est livré de nouveau.

Un abonné ne reçoit que ce que nomment ses valeurs vérifiées : un paramètre de canal lié (x-flexway-bind: tenant, subject ou claim:<nom>) ou l'attribut tenant filtré sur les en-têtes, jamais sur data. Un canal ni lié, ni filtré, ni déclaré public est refusé au chargement. Un accès public se déclare explicitement (x-flexway-public: true sur l'opération receive) et reste compté par adresse et globalement.

Le tampon est borné par flux, un abonné trop lent est fermé, et max_streams plafonne les flux par appelant et par réplique (429 too_many_streams). L'état durable - positions, groupes - reste dans le courtier : la passerelle reste sans état. L'abonnement d'un agent à un flux par outil MCP est à venir.

Tous les points

  • SSE en éventail, reprise par Last-Event-ID
  • WebSocket au moins une fois, acquittement explicite
  • Isolation par valeurs vérifiées, jamais par le contenu
  • Public seulement s'il est déclaré

Fonctionnalités et statut

  • Médiation de la frontière synchrone vers asynchroneLivré · v1.5.0
Lire dans la documentation : Publier et consommer sur un courtier

Kafka, AMQP et MQTT sous la même admission

Livré · v1.5.0

Kafka, AMQP et MQTT passent par la même admission que le trafic HTTP (identité, quota, audit, trace), la passerelle atteignant chaque courtier en client.

  • Kafka, AMQP 0-9-1, AMQPS et MQTT
  • Courtier atteint en client, jamais relayé
  • SASL et mTLS, secrets par référence
Voir le détailMasquer le détail - Kafka, AMQP et MQTT sous la même admission

Kafka, AMQP 0-9-1 (et AMQPS) et MQTT passent par la même admission que le trafic HTTP : identité, quota, audit, trace. La passerelle atteint un courtier en client, jamais par un écouteur de courtier, et une opération du contrat n'est jamais relayée telle quelle vers un courtier. Les amonts se déclarent par upstreams.*.protocol (kafka, amqp, mqtt), avec brokers, protocol_version et sasl dont le mot de passe est une référence.

À la consommation, les deux modes CloudEvents sont lus selon la règle de chaque liaison : application/cloudevents+json en structuré, binaire sinon. Les erreurs du plan asynchrone sont rendues dans un attribut CloudEvents, comme elles le sont en RFC 9457 sur HTTP. La configuration se recharge à chaud : un client de courtier inchangé est réutilisé, et un client par abonnement coûte des connexions, d'où le plafond max_streams.

Tous les points

  • Kafka, AMQP 0-9-1, AMQPS et MQTT
  • Courtier atteint en client, jamais relayé
  • SASL et mTLS, secrets par référence
  • Rechargement à chaud, clients inchangés réutilisés

Fonctionnalités et statut

  • AMQP(S) et MQTTLivré · v1.5.0
  • Traduction vers l'erreur JSON-RPC (MCP) et l'attribut CloudEvents (asynchrone)Livré · v1.5.0
Lire dans la documentation : Exemples : Kafka, RabbitMQ, MQTT, Avro, NATS, AMQP 1.0

Webhooks sortants signés et rejouables

Livré · v1.5.0

Une opération receive livre les évènements d'un tenant à une cible déclarée, signés au format Standard Webhooks, avec réessais bornés et file de rebut rejouable.

  • Standard Webhooks, HMAC-SHA256, rotation à deux secrets
  • Adresse vérifiée à la connexion, aucune redirection
  • Au moins une fois, file de rebut obligatoire
Voir le détailMasquer le détail - Webhooks sortants signés et rejouables

Une opération receive peut livrer à une cible déclarée (x-flexway-deliver, amont protocol: webhook). La consommation se fait dans un groupe partagé par les répliques, une réplique par message, au format Standard Webhooks : webhook-id égal à l'id de l'évènement, signature HMAC-SHA256 qui couvre les attributs, deux secrets actifs pour la rotation, corps en CloudEvent structuré. Un partenaire reçoit ainsi les évènements de son tenant sans accès au courtier.

L'adresse est vérifiée à la connexion : boucle locale, lien local et métadonnées du nuage sont toujours refusés, les plages privées seulement avec allow_private, sans proxy ni redirection. Les réessais sont bornés (retries.max, retries.max_delay) et respectent Retry-After, avec un coupe-circuit par cible. La position n'avance qu'après un 2xx ; réessais épuisés ou refus 4xx, l'évènement intact part dans la file de rebut déclarée, avec problemcode et problemstatus, d'où il peut être rejoué.

Une livraison n'a pas d'appelant : un canal lié à un fait d'appelant (subject, claim) ne peut pas être livré par webhook, et une livraison sans tenant ou sans file de rebut est refusée au chargement.

Tous les points

  • Standard Webhooks, HMAC-SHA256, rotation à deux secrets
  • Adresse vérifiée à la connexion, aucune redirection
  • Au moins une fois, file de rebut obligatoire
  • Réessais bornés, coupe-circuit par cible

Fonctionnalités et statut

  • Webhooks sortants signés et rejouablesLivré · v1.5.0
Lire dans la documentation : Recevoir des webhooks signés

Proxy Kafka natif

En partie

Le proxy Kafka natif branche des clients Kafka directement sur la passerelle, avec des clusters et des sujets virtuels par tenant.

  • Proxy Kafka natif : livré · v1.6.1
  • ACL et quotas par client Kafka : en partie
  • Chiffrement de champs des messages : livré · v1.6.1
Voir le détailMasquer le détail - Proxy Kafka natif

Le plan asynchrone livré médie entre HTTP et les courtiers. Le proxy Kafka natif va plus loin : des clients Kafka branchés directement sur la passerelle, avec des clusters et des sujets virtuels par tenant.

Il s'accompagne d'ACL et de quotas par client Kafka, puis du chiffrement de champs des messages au niveau du proxy. L'état de ces trois fonctionnalités à cette version, lu dans le catalogue du produit, est indiqué ci-dessous.

Tous les points

  • Proxy Kafka natif : livré · v1.6.1
  • ACL et quotas par client Kafka : en partie
  • Chiffrement de champs des messages : livré · v1.6.1

Fonctionnalités et statut

  • Proxy Kafka natif : clients Kafka branchés sur la passerelle, clusters et sujets virtuels par tenantLivré · v1.6.1
  • ACL et quotas par client Kafka au proxy natifEn partie
  • Chiffrement de champs des messages au proxy natifLivré · v1.6.1
Lire dans la documentation : Clients Kafka natifs : clusters virtuels par tenant

Configuration

Pas encore d'exemple complet pour ce domaine dans la version v1.6.3 : il arrivera avec une prochaine version.

Fonctionnalités

Ce qui est livré dans la version publiée v1.6.3, et ce qui vient ; une fonctionnalité n'est jamais présentée comme livrée avant sa version.

FonctionnalitéStatut
AsyncAPI comme source du plan asynchroneLivré · v1.5.0
Publication Kafka sous contrat, enveloppe CloudEventsLivré · v1.5.0
Médiation de la frontière synchrone vers asynchroneLivré · v1.5.0
AMQP(S) et MQTTLivré · v1.5.0
Webhooks sortants signés et rejouablesLivré · v1.5.0
Proxy Kafka natif : clients Kafka branchés sur la passerelle, clusters et sujets virtuels par tenantLivré · v1.6.1
ACL et quotas par client Kafka au proxy natifEn partie
Chiffrement de champs des messages au proxy natifLivré · v1.6.1
Console : clients et clusters Kafka, connexions par tenant, refus par cause, chiffrement et règles d'alerte intégréesLivré · v1.6.1

Toutes les fonctionnalités

Les autres attentes de ce domaine

  • Orchestration locale autonomeDécision locale par règles déclarées ; l'orchestration reste au service de décisionEn partie · suite à dater
  • Décisions liées à l'état réel du systèmeexternal-call couvre HTTP ; les commandes asynchrones : candidatÀ dater
  • Normaliser les protocoles terrain (MQTT, Sparkplug B, OPC UA PubSub)Écouteur MQTT en proxy, Sparkplug B, OPC UA PubSub JSONPrévu en 1.7
  • CoAP des appareils contraintsAucun écouteur CoAP ; candidat sur demande réelleÀ dater
  • Identité des équipements, certificats, segmentationX.509, jeton, clé par appareil, topic lié à l'identitéPrévu en 1.7

Les autres domaines

Parlons de votre passerelle

Flexwiz est une jeune entreprise : vous parlez directement avec la personne qui la fonde. Dites-nous ce que vous voulez faire passer par Flexway. Nous parlons de votre infrastructure et de vos exigences de souveraineté numérique.

La prise de rendez-vous en ligne arrive bientôt ; d'ici là, un e-mail suffit.