scala - Akka Stream Kafka vs Kafka Streams
akka kafka consumer (3)
Actualmente estoy trabajando con Akka Stream Kafka para interactuar con kafka y me preguntaba cuáles eran las diferencias con Kafka Streams .
Sé que el enfoque basado en Akka implementa las especificaciones reactivas y maneja la contrapresión, la funcionalidad de la que kafka parece faltar.
¿Cuál sería la ventaja de usar los flujos de kafka sobre los flujos de akka kafka?
La gran ventaja de Akka Stream sobre Kafka Streams sería la posibilidad de implementar gráficos de procesamiento muy complejos que pueden ser cíclicos con entrada / salida de ventilador y bucle de retroalimentación. Los flujos de Kafka solo permiten gráficos acíclicos si no estoy equivocado. Sería muy complicado implementar un gráfico de procesamiento cíclico en la parte superior de los flujos Kafka
Su pregunta es muy general, así que daré una respuesta general desde mi punto de vista.
Primero, tengo dos escenarios de uso:
- casos en los que estoy leyendo datos de kafka, procesándolos y escribiendo algo de vuelta a kafka, para estos estoy usando flujos de kafka exclusivamente.
- casos en los que la fuente de datos o el sumidero no es kafka, para los que estoy usando flujos akka.
Esto ya me permite responder a la parte sobre la contrapresión: para el primer escenario anterior, hay un mecanismo de contrapresión en las corrientes de kafka.
Centrémonos ahora en el primer escenario descrito anteriormente. Veamos qué perdería si decidiera dejar de usar las transmisiones de Kafka:
- algunas de las etapas de mis procesadores de flujo necesitan un almacén de estado persistente (distribuido), kafka streams me lo proporciona. Es algo que los flujos de akka no proporcionan.
- Al escalar, los flujos de kafka equilibran automáticamente la carga tan pronto como se inicia una nueva instancia de un procesador de flujo, o tan pronto como uno muere. Esto funciona dentro de la misma JVM, así como en otros nodos: escalando hacia arriba y hacia afuera. Esto no es proporcionado por los flujos de akka.
Esas son las diferencias más importantes que me importan, ¡espero que tenga sentido para usted!
Encontré este artículo para dar un buen resumen de las preocupaciones de diseño distribuido que proporciona Kafka Streams
(complementa Akka Streams
).
https://www.beyondthelines.net/computing/kafka-streams/
ordenamiento de mensajes : Kafka mantiene una especie de registro de solo anexado donde almacena todos los mensajes. Cada mensaje tiene un identificador de secuencia también conocido como desplazamiento. El desplazamiento se utiliza para indicar la posición de un mensaje en el registro. Kafka streams usa estas compensaciones de mensajes para mantener el orden.
partición : Kafka divide un tema en particiones y cada partición se replica entre diferentes corredores. La partición permite repartir la carga y la replicación hace que la aplicación sea tolerante a errores (si un intermediario está inactivo, los datos aún están disponibles). Eso es bueno para la partición de datos, pero también necesitamos distribuir los procesos de una manera similar. Kafka Streams utiliza la topología del procesador que se basa en la administración del grupo Kafka. Esta es la misma administración de grupo que utiliza el consumidor de Kafka para distribuir la carga de manera uniforme entre los corredores (este trabajo es administrado principalmente por los corredores).
Tolerancia a fallos : la replicación de datos garantiza la tolerancia a fallos de datos. La administración de grupos tiene una tolerancia a fallos integrada, ya que redistribuye la carga de trabajo entre las instancias de broker en vivo restantes.
Administración estatal : Kafka streams proporciona un almacenamiento local respaldado por un tema de registro de cambios de kafka que usa la compactación de registros (conserva solo el último valor para una clave dada). Compactación de registros de Kafka
Reprocesamiento : al iniciar una nueva versión de la aplicación, podemos reprocesar los registros desde el principio para calcular el nuevo estado y luego redirigir el tráfico a la nueva instancia y cerrar la aplicación anterior.
Gestión del tiempo : "Los datos de transmisión nunca están completos y siempre pueden llegar fuera de orden", por lo tanto, se debe distinguir el tiempo del evento frente al tiempo procesado y manejarlo correctamente.
El autor también dice: "Al utilizar este tema de registro de cambios, Kafka Stream puede mantener una" vista de tabla "del estado de la aplicación".
Mi opinión es que esto se aplica principalmente a una aplicación empresarial donde el "estado de la aplicación" es ... pequeño.
Para una aplicación de ciencia de datos que trabaja con "big data", el "estado de la aplicación" producido por una combinación de munging de datos, modelos de aprendizaje automático y lógica empresarial para orquestar todo esto probablemente no se gestionará bien con Kafka Streams
.
Además, estoy pensando que usar un "tiempo de ejecución de eventos puramente funcional" como https://github.com/notxcain/aecor ayudará a que las mutaciones sean explícitas y separe la lógica de la aplicación de la tecnología utilizada para administrar la forma persistente del estado a través de La gestión de principios de mutación de estado y "efectos" de IO (programación funcional).
En otras palabras, la lógica empresarial no se enreda con los apis de Kafka
.