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:
- 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.
- 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.
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:
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.