java - kafka - queue open source
¿Podemos tener una fuerte capacidad de enrutamiento con Apache Kafka similar a RabbitMq? (1)
Estamos tratando de evaluar Kafka y reemplazar Rabbit Mq en nuestro software.
Conocemos las ventajas de Kafka en términos de consumo de RabbitMq fuera de línea, gran persistencia, excelente rendimiento, baja latencia y alto rendimiento.
Pero necesitamos la capacidad del modo que RabbitMq tiene con el enrutamiento granular de intercambio de temas para el consumo heterogéneo.
Hasta cierto punto, podemos lograr esto teniendo más número de particiones por intermediario en Kafka. Pero tiene sus propias limitaciones, como la sobrecarga de los metadatos del tema en znode, aumenta la latencia.
Nuestro caso de uso es filtrar datos dentro de la partición. Supongamos que obtiene 100 datos de sensor de tipo similar en una partición. ¿Puede el consumidor tener la capacidad de seleccionar solo algunos de los datos del sensor e ignorar el resto?
Podemos hacer el filtrado / enrutamiento en el lado de la aplicación (del consumidor), pero parece que no es reutilizable y los gastos generales adicionales en cada lado del consumidor.
¿Hay alguna manera de que Kafka pueda proporcionar una gran capacidad de enrutamiento al tener un número óptimo de particiones?
Gracias, Ashish
El modelo de mensajería de Kafka es un modelo mucho más simple que RabbitMQ, y es prudente que los usuarios usen las pocas abstracciones que proporciona tal como fueron diseñadas. Realmente, los temas son el único nivel de enrutamiento que se debe hacer en Kafka. Las particiones solo sirven para escalar, proporcionar orden (pero solo dentro de la partición, que es un problema notable para la escalabilidad si tiene una aplicación dependiente de orden), y facilitar la concurrencia de los consumidores dentro de un tema.
El problema con el enrutamiento a nivel de particiones es que no es escalable porque las particiones son el elemento de Kafka que proporciona escalabilidad (al menos en la capa de mensajería). Obviamente, Kafka no está diseñado para el enrutamiento granular. Está diseñado para mensajería pub / sub persistente, confiable y escalable. Tampoco están las particiones diseñadas para escalar a través del clúster. Por su propia naturaleza, las particiones son locales para uno o unos pocos nodos de Kafka (dependiendo del factor de replicación del tema), pero Kafka propaga múltiples particiones dentro de un tema a través del clúster. Esto significa que existe un cierto potencial de detección activa si los mensajes están favoreciendo una partición particular en lugar de estar distribuidos uniformemente entre las particiones de un tema (por lo que el productor de Kafka normalmente maneja las particiones por usted).
En términos de filtrado del lado del cliente, creo que tienes razón: para mí se sienten como un montón de recursos desperdiciados, pero tal vez no me gusta demasiado el desperdicio de recursos.
En resumen, creo que puede arriesgarse a meterse en un agujero si trata de pensar en las abstracciones de mensajes de Kafka en términos tan complejos. Kafka está muy bien diseñado y optimizado para distribuir la carga a través de particiones, por lo que no es ideal para ellos optar por un caso de uso diferente, aunque vagamente similar.
Tengo la sensación de que puede administrar su caso de uso dentro del contexto de las características de Kafka. Considero que el mayor desafío con los esquemas de enrutamiento complejos dentro del marco temático de Kafka es evitar la duplicación de datos en múltiples temas, pero una vez que comprenda cómo varias aplicaciones pueden consumir desde diferentes posiciones dentro del mismo tema, ese problema parece desaparecer. En este sentido, es importante pensar en Kafka más como un registro que como una cola.
En una nota lateral, creo que su preocupación con znodes necesarios para administrar particiones no tiene fundamento. Si tiene suficientes temas y particiones para consumir la memoria de sus nodos ZooKeeper (una tonelada), es probable que ya haya tenido problemas de recursos mucho mayores.