Comprender los temas y particiones de Kafka


185

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 produce un mensaje, especificará el tema al que desea enviar el mensaje, ¿es así? ¿Le importan las particiones?
  2. Cuando se está ejecutando un suscriptor, ¿especifica su ID de grupo para que pueda ser 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?

Respuestas:


162

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:

resumen de los componentes del productor

1. Cuando un productor produce 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 ninguna identificación 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. fuente

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 cantidad de consumidores menos que particiones temáticas
  • 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, número de consumidores igual que número de particiones de tema
  • El número de consumidores es mayor que el número de particiones temáticas, entonces la partición y el mapeo del consumidor pueden ser como se ve a continuación, No es efectivo, verifique el Consumidor 5 número de consumidores más que número de particiones temáticas

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

El consumidor debe estar al tanto 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 el manual estableciendo enable.auto.commiten false. En ese casoconsumer.commitSync() y consumer.commitAsync()puede ser útil para la gestión de 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 auto.offset.resetconfiguración que podría ser latest/earliest. técnicamente es latest(comience a procesar mensajes nuevos) porque todos los mensajes expiraron en ese momento y la retención es una configuración de nivel de tema.


55
Hola ! Soy el autor de la respuesta aceptada, pero creo que la suya también es muy buena, sobre todo en el punto número 3, donde los diagramas hacen que las cosas sean un 200% más claras. ¿Crees que deberíamos fusionarnos?
C4stor

Quise decir que yo (o usted) podría incorporar elementos de su respuesta en la mía, para obtener más visibilidad y mejorar esta (actualmente) respuesta principal. ¡Pero no lo haría sin su consentimiento!
C4stor

¿Por qué no se puede asignar un consumidor múltiple a una partición? Para garantizar el mensaje solo procesar por una vez? Gracias por tu respuesta.
g10guang

1
@ g10guang: se debe a la dificultad de confirmar el mantenimiento de compensación .
mrsrinivas el

1
Otro escenario Puede tener UNA partición y MÚLTIPLES consumidores suscritos / asignados. El corredor entregará registros solo al primer consumidor registrado. Pero supongamos que el primer consumidor tarda más tiempo en procesar la tarea que el intervalo de sondeo. El consumo récord no se compromete con el corredor. El corredor entiende que el consumidor pasó el rato. En este estado, el corredor desencadena un reequilibrio enviando las nuevas particiones asignadas a todos sus consumidores. El mensaje es consumido nuevamente por otro consumidor a pesar de que C1 aún lo está procesando. Ten cuidado.
Ruben Daddario

127

Tomemos esos en orden :)

1 - Cuando un productor produce 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 asigna cada partición existente.


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 las 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 al más antiguo disponible (dependiendo de el valor de configuración auto.offset.reset) y continúe trabajando.


3
Sry :) Es un poco difícil explicar todo el proceso de kafka en cajas de 500 caracteres, sugiero leer kafka.apache.org/documentation.html#theconsumer (y probablemente el resto de la sección 4, sobre las partes internas de kafka). Básicamente: los consumidores solicitan compensaciones de ahorro, pero se guardan en otro lugar.
C4stor

Acabo de leer esto y aún así esto no explica dónde se lleva a cabo: Kafka maneja esto de manera diferente. Nuestro tema se divide en un conjunto de particiones totalmente ordenadas, cada una de las cuales es consumida por un consumidor en un momento dado. Esto significa que la posición de un consumidor en cada partición es solo un número entero, el desplazamiento del siguiente mensaje a consumir. Esto hace que el estado sobre lo que se ha consumido sea muy pequeño, solo un número para cada partición. Este estado puede ser revisado periódicamente. Esto hace que el equivalente a los acuses de recibo de mensajes sea muy barato.
Pinidbest

20

Kafka usa el tema concepción del 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 de una parte de 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/


¿La partición es solo para el equilibrio de carga del tema?
g10guang

1
@ g10guang: las particiones también ayudan a procesar los mensajes en paralelo.
mrsrinivas

Corríjame si estoy equivocado, cuando un mensaje enviado por un productor y cuando se trata del tema, se copia en las particiones según las configuraciones y luego el consumidor lo consume. ¿Correcto?
Atul

1
@Atul el mensaje se agregará a 1 de las particiones para ese tema de acuerdo con la configuración actual del Particionador (de forma predeterminada, el hash de la clave del mensaje determina a qué partición va el mensaje), y sí, un Consumidor recogerá el mensaje como consume mensajes de esa partición
Kevin Hooke

@ Kevin Hooke, gracias por la explicación y por aclarar mi comprensión.
Atul
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.