tutorial topic protocol partitions kafka create apache-kafka kafka-consumer-api kafka-producer-api

apache-kafka - topic - kafka zookeeper



Comprender los temas y particiones de Kafka (3)

Estoy empezando a aprender Kafka para propósitos de soluciones empresariales.

Durante mis lecturas, me vinieron a la mente algunas preguntas:

  1. Cuando un productor está produciendo un mensaje, especificará el tema al que desea enviar el mensaje, ¿es así? ¿Le importan las particiones?
  2. Cuando se ejecuta un suscriptor, ¿especifica su ID de grupo para que pueda formar parte de un grupo de consumidores del mismo tema, o varios temas en los que este grupo de consumidores está interesado?
  3. ¿Cada grupo de consumidores tiene una partición correspondiente en el corredor o cada consumidor tiene una?

  4. ¿Son las particiones creadas por el corredor y, por lo tanto, no son una preocupación para los consumidores?

  5. Dado que esta es una cola con un desplazamiento para cada partición, ¿es responsabilidad del consumidor especificar qué mensajes quiere leer? ¿Necesita salvar su estado?

  6. ¿Qué sucede cuando un mensaje se elimina de la cola? - Por ejemplo: la retención fue de 3 horas, luego pasa el tiempo, ¿cómo se maneja el desplazamiento en ambos lados?


Esta publicación ya tiene respuestas, pero estoy agregando mi punto de vista con algunas imágenes de la Guía definitiva de Kafka

Antes de responder cada pregunta, agreguemos una descripción general de los componentes del productor:

1. Cuando un productor está produciendo un mensaje: especificará el tema al que desea enviar el mensaje, ¿es así? ¿Le importan las particiones?

El productor decidirá la partición de destino para colocar cualquier mensaje, dependiendo de:

  • ID de partición, si se especifica dentro del mensaje
  • clave% num particiones , si no se menciona ningún ID de partición
  • Round robin si ni la identificación de la partición ni la clave del mensaje están disponibles en el mensaje, lo que significa que solo está disponible el valor

2. Cuando se ejecuta un suscriptor: ¿especifica su ID de grupo para que pueda formar parte de un grupo de consumidores del mismo tema o de varios temas en los que este grupo de consumidores está interesado?

Siempre debe configurar group.id a menos que esté utilizando la API de asignación simple y no necesite almacenar compensaciones en Kafka. No será parte de ningún grupo. source

3. ¿Cada grupo de consumidores tiene una partición correspondiente en el corredor o cada consumidor tiene una?

En un grupo de consumidores, cada partición será procesada por un solo consumidor . Estos son los posibles escenarios.

  • El número de consumidores es menor que el número de particiones de tema, luego se pueden asignar múltiples particiones a uno de los consumidores del grupo
  • Número de consumidores igual que número de particiones de tema, luego la asignación de particiones y consumidores puede ser como a continuación,
  • El número de consumidores es mayor que el número de particiones de tema, entonces la asignación de particiones y consumidores puede ser como se ve a continuación.

4. Como las particiones creadas por el corredor, por lo tanto, no es una preocupación para los consumidores?

El consumidor debe conocer el número de particiones, como se discutió en la pregunta 3.

5. Dado que esta es una cola con un desplazamiento para cada partición, ¿es responsabilidad del consumidor especificar qué mensajes quiere leer? ¿Necesita salvar su estado?

Kafka (para ser el Coordinador de grupo específico) se encarga del estado de compensación produciendo un mensaje a un tema interno __consumer_offsets , este comportamiento también se puede configurar en manual estableciendo enable.auto.commit en false . En ese caso, consumer.commitSync() y consumer.commitAsync() pueden ser útiles para administrar el desplazamiento.

Más sobre el coordinador de grupo :

  1. Es uno de los corredores elegidos en el clúster desde el lado del servidor Kafka.
  2. Los consumidores interactúan con el Coordinador de grupo para confirmar compromisos y solicitar solicitudes.
  3. El consumidor envía latidos periódicos al Coordinador del grupo.

6. ¿Qué sucede cuando un mensaje se elimina de la cola? - Por ejemplo: la retención fue de 3 horas, luego pasa el tiempo, ¿cómo se maneja el desplazamiento en ambos lados?

Si algún consumidor comienza después del período de retención, los mensajes se consumirán según la configuración auto.offset.reset , que podría ser la latest/earliest . técnicamente es lo latest (comience a procesar mensajes nuevos) porque todos los mensajes caducaron en ese momento y la retención es una configuración de nivel de tema.


Kafka utiliza la concepción del tema que viene a poner orden en el flujo de mensajes.

Para equilibrar la carga, un tema puede dividirse en múltiples particiones y replicarse entre los corredores.

Las particiones son secuencias de mensajes ordenadas e inmutables que se agregan continuamente, es decir, un registro de confirmación.

Los mensajes en la partición tienen un número de identificación secuencial que identifica de manera única cada mensaje dentro de la partición.

Las particiones permiten que el registro de un tema escale más allá de un tamaño que se ajuste a un único servidor (un intermediario) y actúe como la unidad de paralelismo.

Las particiones de un tema se distribuyen entre los intermediarios en el clúster de Kafka, donde cada intermediario maneja los datos y las solicitudes para compartir las particiones.

Cada partición se replica en un número configurable de intermediarios para garantizar la tolerancia a fallas.

Bien explicado en este artículo: http://codeflex.co/what-is-apache-kafka/


Tomemos esos en orden :)

1 - Cuando un productor está produciendo un mensaje: especificará el tema al que desea enviar el mensaje, ¿es así? ¿Le importan las particiones?

Por defecto, al productor no le importa la partición. Tiene la opción de usar un particionador personalizado para tener un mejor control, pero es totalmente opcional.

2 - Cuando se ejecuta un suscriptor: ¿especifica su ID de grupo para que pueda formar parte de un grupo de consumidores del mismo tema o de varios temas en los que este grupo de consumidores está interesado?

Sí, los consumidores se unen (o crean si están solos) a un grupo de consumidores para compartir la carga. No dos consumidores en el mismo grupo recibirán el mismo mensaje.

3 - ¿Cada grupo de consumidores tiene una partición correspondiente en el corredor o cada consumidor tiene una?

Ninguno. A todos los consumidores en un grupo de consumidores se les asigna un conjunto de particiones, bajo dos condiciones: no hay dos consumidores en el mismo grupo que tengan una partición en común, y al grupo de consumidores en su conjunto se le asignan todas las particiones existentes.

4 - ¿Son las particiones creadas por el corredor, por lo tanto, no son una preocupación para los consumidores?

No lo son, pero puede ver en 3 que es totalmente inútil tener más consumidores que particiones existentes, por lo que es su nivel de paralelismo máximo para el consumo.

5 - Dado que esta es una cola con un desplazamiento para cada partición, ¿es responsabilidad del consumidor especificar qué mensajes quiere leer? ¿Necesita salvar su estado?

Sí, los consumidores guardan un desplazamiento por tema por partición. Esto es totalmente manejado por Kafka, no te preocupes por eso.

6 - ¿Qué sucede cuando un mensaje se elimina de la cola? - Por ejemplo: la retención fue de 3 horas, luego pasa el tiempo, ¿cómo se maneja el desplazamiento en ambos lados?

Si un consumidor alguna vez solicita una compensación no disponible para una partición en los intermediarios (por ejemplo, debido a la eliminación), ingresa en un modo de error y finalmente se restablece para esta partición al mensaje más reciente o más antiguo disponible (dependiendo de el valor de configuración auto.offset.reset) y continúe trabajando.