web-dev-qa-db-fra.com

Kafka prend-il en charge la messagerie de demande de réponse?

J'étudie Kafka 9 en tant que projet de loisir et complète quelques exemples du type "Hello World".

J'ai eu à réfléchir aux applications Real World Kafka basées sur la messagerie de réponse à la demande en général et plus précisément sur la façon de lier un message de demande Kafka à son message de réponse.

Je pensais utiliser un UUID généré en tant que clé de message de demande et utiliser cet UUID de demande en tant que clé de message de réponse associée. Le type de mécanisme utilisé par WebSphere MQ est identique à celui de l'ID de corrélation de message.

Mon processus de fin 2 serait.

1). Le client Kafka génère un UUID aléatoire et envoie un seul message de demande Kafka . 2). Le serveur consomme cet extrait de message de demande et stocke la valeur UUID de demande 3). terminez un processus technique à l'aide du message charge utile . 4). Répondez avec un message de réponse qui utilise la valeur UUID stockée dans le message de demande en tant que message de réponse Key . 5). le client Kafka interroge le sujet de la réponse jusqu'à l'expiration du délai imparti ou la récupération d'un message avec la valeur UUID de la demande d'origine.

Ce qui me préoccupe, c'est que le sondage de Kafka Consumer supprime les messages d'autres clients du sujet de réponse et incrémente les décalages faisant en sorte que d'autres clients échouent.

Est-ce que j'essaie d'appliquer Kafka dans un cas d'utilisation pour lequel il n'a jamais été conçu?

Est-il possible d'implémenter la messagerie demande/réponse dans Kafka?

16
Hector

Même si Kafka fournit des méthodes pratiques pour conserver les compensations validées pour un groupe de consommateurs donné, vous n'êtes pas obligé d'utiliser ce comportement et vous pouvez écrire le vôtre si vous en sentez le besoin. Même dans ce cas, l'utilisation de Kafka telle que vous l'avez décrite est un peu gênante pour le cas d'utilisation car chaque client doit rechercher de manière répétée une réponse dans le sujet. C'est inefficace au mieux.

Vous pouvez diviser le problème en deux parties, en continuant d’utiliser Kafka pour envoyer des requêtes et des réponses à votre serveur. Le seul élément à ajouter serait une sorte de couche d'API à laquelle vos clients parlent et qui encapsule la logique propre à Kafka de vos clients. Cette couche aurait besoin d'une base de données locale (relationnelle ou NoSQL) pouvant stocker les réponses par uuid, ce qui permettrait à l'API de répondre rapidement et facilement si une réponse est disponible pour un uuid spécifique.

6
Chris Gerken

Plus facile! Vous pouvez uniquement écrire sur le gardien de téléphone que vous devez répondre à l'UUID X sur la partition Y et obliger le producteur qui a envoyé cet UUID à utiliser la partition Y ... Cela a-t-il un sens?

1
SmokeMachine

Je n’ai jamais essayé cela, mais en théorie, si avant de commencer tout produit, vous produisez des messages avec des nombres compris entre 0 et le nombre de partitions du sujet de réponse et que vos producteurs sont déjà consommateurs de ce sujet, de sorte que chaque producteur recevra au moins une des réponses. ces messages. Ainsi, vous pouvez stocker cette clé sur chaque producteur et la publier avec la uuid... Après le processus sur le consommateur, le consommateur peut publier la réponse (sur le sujet de la réponse) avec la uuid et la saisir avec la même clé il sera récupéré par le même producteur que celui qui l'a envoyé ... Une fois que tous les messages avec la même clé sont publiés dans la même partition ...

0
SmokeMachine

Je pense que vous avez besoin d’une clé bien définie du service qui appelle la requête. Votre demande doit contenir cette clé de partition et le nom du sujet où publier la réponse. Aussi, vous devriez créer une sorte de machine à états et quand un message concernant votre tâche arrive, vous passez à un état ... ceci serait pour une conception asynchrone stricte

0
Martin Kosicky