utilizar tutorial kafka introduccion español como arquitectura apache-kafka kafka-consumer-api kafka-producer-api mom

apache kafka - tutorial - ¿Kafka soporta mensajes de respuesta solicitados?



java kafka (4)

Estoy investigando Kafka 9 como un proyecto de hobby y completé algunos ejemplos del tipo "Hello World".

Tengo que pensar en las aplicaciones Real World Kafka basadas en los mensajes de respuesta de solicitud en general y más específicamente cómo vincular un mensaje de solicitud Kafka a su mensaje de respuesta.

Estaba pensando en utilizar un UUID generado como clave de mensaje de solicitud y emplear este UUID de solicitud como clave de mensaje de respuesta asociado. Mucho del mismo tipo de mecanismo que WebSphere MQ tiene el ID de correlación del mensaje.

Mi final 2 proceso final sería.

1). El cliente Kafka genera un UUID aleatorio y envía un solo mensaje de solicitud Kafka. 2). El servidor consumiría este extracto de mensaje de solicitud y almacenaría el valor UUID de la solicitud 3). completar un proceso de negocio utilizando la carga útil del mensaje. 4). Responda con un mensaje de respuesta que emplee el valor UUID almacenado del mensaje de solicitud como clave de mensaje de respuesta. 5). el cliente Kafka sondea el tema de respuesta hasta que se agote el tiempo de espera o recupere un mensaje con el valor UUID de la solicitud original.

Lo que me preocupa es que el sondeo de Kafka Consumer eliminará los mensajes de otros clientes del tema de respuesta e incrementará las compensaciones haciendo que otros clientes fallen.

¿Estoy tratando de aplicar Kafka en un caso de uso para el que nunca fue diseñado?

¿Es posible implementar mensajes de solicitud / respuesta en Kafka?


¡Más fácil! Solo puede escribir en el guardián del zoológico que el UUID X debe responderse en la partición Y, y hacer que el productor que envió ese UUID consuma la partición Y ... ¿Eso tiene sentido?


Creo que necesita una clave de partición bien definida del servicio que invoca la solicitud. Su solicitud debe contener esta clave de fragmento y el nombre del tema donde se debe publicar la respuesta. También debe crear algún tipo de máquina de estado y cuando llegue un mensaje con respecto a su tarea, pasará a algún estado ... esto sería para un diseño asíncrono estricto.


A pesar de que Kafka proporciona métodos de conveniencia para persistir las compensaciones comprometidas para un grupo de consumidores determinado, no está obligado a usar ese comportamiento y puede escribir el suyo propio si siente la necesidad. Aun así, el uso de Kafka de la forma en que lo describió es un poco incómodo para el caso de uso, ya que cada cliente necesita buscar repetidamente el tema para obtener una respuesta específica. Eso es ineficiente en el mejor de los casos.

Podría dividir el problema en dos partes y continuar utilizando Kafka para enviar solicitudes y respuestas desde su servidor. La única pieza que necesitaría agregar sería algún tipo de capa API con la que sus clientes hablen y que encapsule la lógica específica de Kafka de sus clientes. Esta capa necesitaría una base de datos local (relacional o NoSQL) que podría almacenar las respuestas de uuid, lo que hace que la API responda de manera muy rápida y sencilla si hay una respuesta disponible para un uuid específico.


Nunca lo intenté, pero en teoría, si antes de comenzar cualquier producción, produce algunos mensajes con números del 0 al número de particiones del tema de respuesta y sus productores ya son consumidores de ese tema, por lo que cada productor recibirá al menos uno de esos mensajes Entonces, puede almacenar esa clave en cada productor y publicarla con el uuid ... Después del proceso en el consumidor, puede publicar la respuesta (en el tema de la respuesta) con el uuid y teclear con la misma clave enviada con ella, por lo que lo obtendrá el mismo productor que lo envió ... Una vez que todos los mensajes con la misma clave se publiquen en la misma partición ...