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.
Asynchrone
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
minimum et maximum du schéma sur les charges validées ; les règles cliniques restent au serviceEn partie · suite à dater1.7.0) ; condition sur l'état réel : candidat ; les sécurités physiques restent indépendantesEn partie · suite à dater

Problème 1
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
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
Le destinataire ne peut ni vérifier l'origine ni rejouer.
Réponse de Flexway : Webhooks signés, rejouables, sous le même audit.
Chaque étape est une décision lisible dans la trace et dans la console.
Asynchrone - Schéma du domaine : qui appelle, les étapes de décision, ce qui est appelé, et le cas de refus.
canal non déclaré : refus
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.
Trajets qui passent ici
Les entreprises partenaires qui consomment vos API : identifiées par certificat client ou clé d'API, sous un quota par tenant.
Trajets qui passent ici
Le canal doit être déclaré dans le contrat AsyncAPI ; un canal non déclaré est refusé avant toute publication.
Trajets qui passent ici
Flexway vérifie qui appelle (jeton OIDC, clé d'API ou certificat client) et lit le tenant dans l'identité ; sans identité valide : 401.
Trajets qui passent ici
Un seau à jetons par appelant limite son débit ; au-delà : 429 avec Retry-After et les en-têtes RateLimit.
Trajets qui passent ici
Le message est posé dans une enveloppe CloudEvents 1.0, pour que tout consommateur le lise de la même façon.
Trajets qui passent ici
Flexway publie le message sur votre courtier Kafka, AMQP ou MQTT, en client de ce courtier.
Trajets qui passent ici
L'appelant reçoit 202 avec un identifiant : le message est accepté, la suite est asynchrone.
Trajets qui passent ici
Votre cluster Kafka : Flexway y publie les événements reçus en HTTP, sous contrat, en enveloppe CloudEvents.
Trajets qui passent ici
Vos courtiers AMQP et MQTT : Flexway y publie en client du courtier, sous contrat AsyncAPI.
Trajets qui passent ici
Les systèmes de vos partenaires : ils reçoivent vos événements en webhooks signés et rejouables.
Trajets qui passent ici
L'essentiel de chaque sujet, avec son statut dans la version publiée ; dépliez une carte pour le texte complet.
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.
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é.
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.
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.
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.
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.
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 (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.
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.
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.
Le proxy Kafka natif branche des clients Kafka directement sur la passerelle, avec des clusters et des sujets virtuels par tenant.
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.
Pas encore d'exemple complet pour ce domaine dans la version v1.6.3 : il arrivera avec une prochaine version.
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 asynchrone | Livré · v1.5.0 |
| Publication Kafka sous contrat, enveloppe CloudEvents | Livré · v1.5.0 |
| Médiation de la frontière synchrone vers asynchrone | Livré · v1.5.0 |
| AMQP(S) et MQTT | Livré · v1.5.0 |
| Webhooks sortants signés et rejouables | Livré · v1.5.0 |
| Proxy Kafka natif : clients Kafka branchés sur la passerelle, clusters et sujets virtuels par tenant | Livré · v1.6.1 |
| ACL et quotas par client Kafka au proxy natif | En partie |
| Chiffrement de champs des messages au proxy natif | Livré · v1.6.1 |
| Console : clients et clusters Kafka, connexions par tenant, refus par cause, chiffrement et règles d'alerte intégrées | Livré · v1.6.1 |
Les autres attentes de ce domaine
external-call couvre HTTP ; les commandes asynchrones : candidatÀ daterFlexwiz 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.