API del procesador Kafka: ¿Clave diferente para Source y StateStore?
Actualmente estamos implementando un proceso (utilizando la API del procesador Kafka) donde necesitamos combinar información de 2 eventos correlacionados (mensajes) sobre un tema y luego reenviar esa información combinada. Los eventos se originan en dispositivos IoT y, dado que queremos mantenerlos en orden, el tema de origen utiliza un identificador de dispositivo como clave. Los eventos también contienen una ID de correlación:
Llave
{ deviceId: "..." }
Mensaje
{ deviceId: "...", correlationId: "...", data: ...}
Nuestro primer enfoque fue crear un procesador que tenga un State Store conectado, que almacene cada mensaje entrante, utilizando la ID de correlación como clave. Eso nos permite consultar en la tienda la ID de correlación de un mensaje entrante, y si ya hay un mensaje con la misma ID en la tienda, podemos combinar la información, reenviar un nuevo evento y eliminar la entrada de la tienda. Entonces, para cada ID de correlación sucede lo siguiente: en algún momento el primer mensaje con esa ID se consume y almacena y en algún otro momento en el tiempo en que el segundo mensaje con esa ID da como resultado la eliminación de la entrada de la tienda.
Clave de estado
{ correlationId: "..." }
Valor del estado
{ event: { deviceId: "...", correlationId: "...", data: ... }}
Pero ahora nos preguntamos cómo Kafka Streams está manejando las diferentes claves. Estamos utilizando un enfoque de microservicio y habrá múltiples instancias de ese servicio en ejecución. La tienda está respaldada automáticamente por un tema interno. Considere volver a escalar las instancias de servicio, s.t. Las particiones del tema de origen y el tema de estado se vuelven a equilibrar. ¿Es posible que la partición para una ID de correlación específica se asigne a otro servicio que no sea la partición para la ID de dispositivo correspondiente? ¿Podríamos terminar en una situación en la que el segundo evento con el mismo ID de correlación sería consumido por una instancia de servicio, que no tiene acceso al primer evento ya almacenado?
¡Gracias por adelantado!