es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Implementación de migración de eventos spring-kafka fixtureados

Tengo varios servicios y uno de ellos es la fuente de verdad (SOT). Kafka es un intermediario de mensajes para ellos. De vez en cuando, necesito generar un conjunto de eventos que serán consumidos y aplicados en otros servicios. Esto se llama migración de eventos de fixture.

Mi archivo de fixture de ejemplo:

EntityUpdated (topicA)
- id
- relación

RelationUpdated (topicB)
- id
- relación

Y las clases son entidades de Spring que tienen una proyección en la base de datos después de aplicar los eventos.

class Entity: Model {
  id
  val relación: Relación
}

class Relación: Model {
  id
}

La implementación actual del consumidor lee los temas de manera arbitraria y el consumidor puede leer datos de topicB antes de topicA, lo que provoca un caso en el que el mensaje no se puede aplicar porque la entidad relacionada aún no existe (RelationUpdated consumido antes de EntityUpdated).

Tengo varias ideas para solucionarlo:

  1. Pausar todas las particiones/temas y reanudar en un orden especificado. De esta manera, evito el caso de “RelationUpdated consumido antes de EntityUpdated”. Luego, después de reanudar todas las particiones para todos los temas, puedo seguir trabajando de manera arbitraria. No me gusta cambiar, pero parece que funciona.
  2. Poner los mensajes que no se pudieron aplicar en una cola de mensajes llamada “dead letter” y tratar de reproducirlos una y otra vez hasta que todos se hayan aplicado.

Tal vez alguien haga algo similar. Estoy feliz de conocer tus ideas.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para garantizar el orden correcto del consumo de eventos con Kafka

    Es un problema común asegurar que los eventos de Kafka se consuman en el orden correcto, especialmente cuando intervienen servicios interdependientes. El problema puede llevar a situaciones en las que los eventos no se pueden aplicar porque requieren datos de un evento precedente.

    Como experto en tecnología de la información especializado en apache-kafka y spring-kafka, puedo sugerir dos soluciones potenciales:

    1. Pausar y reanudar particiones/topics en un orden especificado: Pausar todas las particiones/topics y reanudarlas en el orden adecuado es una solución temporal al problema. Una vez que todas las particiones de todos los topics se hayan reanudado, el consumidor puede continuar trabajando de forma arbitraria. Sin embargo, no es una solución ideal, ya que implica cambios frecuentes, lo que puede llevar a inconsistencias en los datos.
    2. Cola de mensajes no procesables: Cuando un mensaje no se puede aplicar, Kafka puede enviarlo a una cola de mensajes no procesables. Luego, se puede volver a reproducir el mensaje una y otra vez hasta que se pueda aplicar correctamente. Esta solución requiere un trabajo adicional, pero es más resistente y menos disruptiva que la primera opción.

    Ambas soluciones tienen sus desventajas, y cuál elegir depende del caso de uso específico. Es importante considerar factores como el costo, la escalabilidad y la complejidad al decidir cómo garantizar que los eventos de Kafka se consuman en el orden adecuado.

Comments are closed.