usar tutorial quickstart que porque mundo language kafka hola data big apache-kafka

apache-kafka - tutorial - que es zookeeper kafka



¿Cómo minimizar la latencia involucrada en el marco de mensajería kafka? (4)

Kafka puede lograr una latencia de alrededor de milisegundos, mediante el uso de mensajes síncronos. Con la mensajería síncrona, el productor no recopila mensajes en un parche antes de enviarlos.

bin/kafka-console-producer.sh --broker-list my_broker_host:9092 --topic test --sync

Lo siguiente tiene el mismo efecto:

--batch-size 1

Escenario : Tengo un tema de bajo volumen (~ 150msgs / seg) para el cual nos gustaría tener un retraso de propagación bajo del productor al consumidor.

Agregué una marca de tiempo de un productor y la leí al consumidor para registrar el retraso de propagación. Con las configuraciones predeterminadas, el msg (de 20 bytes) mostró un retraso de propagación de 1960ms a 1230ms. No hay demora en la red, ya que probé con un productor y un consumidor simple en la misma máquina.

Cuando he intentado ajustar el intervalo de descarga del tema a 20 ms, se reduce a 1100 ms a 980 ms. Luego intenté ajustar los consumidores "fetcher.backoff.ms" a 10 ms, se redujo a 1070 ms - 860 ms.

Problema : para 20 bytes de un msg, me gustaría tener un retardo de propagación lo más bajo posible y ~ 950ms es una cifra más alta.

Pregunta : ¿Algo me falta en la configuración? Acojo con agrado los comentarios, retraso que obtuviste como mínimo.

Supuesto : El sistema Kafka involucra la E / S del disco antes de que el consumidor obtenga el msg del productor y esto va con las RPM del disco duro y así sucesivamente.

Actualización : Intenté ajustar la política de eliminación de registros para la durabilidad y la latencia.
A continuación se muestra la configuración:

# The number of messages to accept before forcing a flush of data to disk log.flush.interval=10 # The maximum amount of time a message can sit in a log before we force a flush log.default.flush.interval.ms=100 # The interval (in ms) at which logs are checked to see if they need to be # flushed to disk. log.default.flush.scheduler.interval.ms=100

Para el mismo msg de 20 bytes, el retraso fue de 740 ms -880 ms.

Las siguientes afirmaciones quedan claras en la propia configuración.
Hay algunas concesiones importantes:

  1. Durabilidad : los datos sin descarga corren un mayor riesgo de pérdida en caso de una caída.
  2. Latencia : los datos no se ponen a disposición de los consumidores hasta que se descargan (lo que agrega latencia).
  3. Rendimiento : La descarga es generalmente la operación más cara.

Entonces, creo que no hay forma de llegar a una marca de 150 ms - 250 ms. (sin actualización de hardware).


Las versiones modernas de Kafka parecen tener una latencia mínima, como muestran los resultados de here :

2 ms (mediana) 3 ms (percentil 99) 14 ms (percentil 99,9)


No estoy tratando de esquivar la pregunta, pero creo que Kafka es una mala elección para este caso de uso. Si bien creo que Kafka es genial (he sido un gran defensor de su uso en mi lugar de trabajo), su fuerza no es de baja latencia. Sus puntos fuertes son el alto rendimiento del productor y el soporte para consumidores tanto rápidos como lentos. Si bien proporciona durabilidad y tolerancia a fallas, también lo hacen los sistemas de propósito más general como rabbitMQ. RabbitMQ también admite una variedad de clientes diferentes, incluyendo node.js. Donde rabbitMQ se queda corto en comparación con kafka es cuando se trata de volúmenes extremadamente altos (por ejemplo, 150 Kms / s). En ese momento, el enfoque de la durabilidad de Rabbit comienza a desmoronarse y Kafka realmente se destaca. La durabilidad y la capacidad de tolerancia a fallas de los conejos son más que capaces a 20 Kms / s (según mi experiencia).

Además, para lograr un rendimiento tan alto, Kafka trata los mensajes en lotes. Si bien los lotes son pequeños y su tamaño es configurable, no puede hacerlos demasiado pequeños sin incurrir en una gran sobrecarga. Desafortunadamente, el agrupamiento de mensajes hace que la baja latencia sea muy difícil. Si bien puedes ajustar varias configuraciones en kafka, no usaría Kafka para nada en lo que la latencia debía ser consistentemente menor a 1-2 segundos.

Además, kafka 0.7.2 no es una buena opción si está lanzando una nueva aplicación. Todo el enfoque está en 0.8 ahora, por lo que estará solo si tiene problemas y definitivamente no esperaría ninguna característica nueva.

Una vez más, creo que Kafka es ideal para algunos casos de uso muy específicos, aunque populares. En mi lugar de trabajo usamos Rabbit y Kafka. Si bien eso puede parecer gratificante, realmente son complementarios.


Sé que ha pasado más de un año desde que se hizo esta pregunta, pero acabo de crear un grupo Kafka para propósitos de desarrollo, y estamos viendo una latencia de menos de 1 ms desde el productor hasta el consumidor. Mi clúster consta de tres nodos de VM que se ejecutan en un servicio de nube VM (Skytap) con almacenamiento SAN, por lo que está lejos de ser el hardware ideal. Estoy usando Kafka 0.9.0.0, que es lo suficientemente nuevo como para estar seguro de que el autor de la pregunta estaba usando algo más antiguo. No tengo experiencia con versiones anteriores, por lo que puede obtener este aumento de rendimiento simplemente por una actualización.

Estoy midiendo la latencia ejecutando un productor y consumidor de Java que escribí. Ambos se ejecutan en la misma máquina, en una cuarta máquina virtual en el mismo entorno Skytap (para minimizar la latencia de la red). El productor registra la hora actual ( System.nanoTime() ), usa ese valor como la carga útil en un mensaje de Avro y envía (acks = 1). El consumidor está configurado para sondear continuamente con un tiempo de espera de 1 ms. Cuando recibe un lote de mensajes, registra la hora actual ( System.nanoTime() nuevamente), luego resta la hora de recepción de la hora de envío para calcular la latencia. Cuando tiene 100 mensajes, calcula el promedio de las 100 latencias e imprime en la salida estándar. Tenga en cuenta que es importante ejecutar el productor y el consumidor en la misma máquina para que no haya problemas de sincronización de reloj con el cálculo de latencia.

He jugado bastante con el volumen de mensajes generados por el productor. Definitivamente hay un punto en el que hay demasiados y la latencia comienza a aumentar, pero es sustancialmente más alta que 150 / seg. El mensaje ocasional tarda hasta 20 ms en entregarse, pero la gran mayoría tiene entre 0,5 y 1,5 ms.

Todo esto se logró con las configuraciones predeterminadas de Kafka 0.9. No tuve que hacer ningún ajuste. Utilicé batch-size = 1 para mis pruebas iniciales, pero luego descubrí que no tenía ningún efecto a un volumen bajo e impuse un límite significativo en el volumen máximo antes de que las latencias comenzaran a aumentar.

Es importante tener en cuenta que cuando ejecuto a mi productor y consumidor en mi máquina local, la misma configuración reporta las latencias de los mensajes en el rango de 100 ms, las mismas latencias que se reportan si simplemente hago ping a mis corredores Kafka.

Editaré este mensaje más adelante con un código de ejemplo de mi productor y consumidor, junto con otros detalles, pero quería publicar algo antes de que lo olvide.