Comprensión de los temas y las particiones de Kafka

263

Estoy empezando a aprender Kafka, 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 un suscriptor se está ejecutando, ¿especifica su ID de grupo para que pueda ser parte de un grupo de consumidores del mismo tema o de varios temas que le interesan a este grupo de consumidores?

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

  4. ¿Las particiones son 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 desea leer? ¿Necesita salvar su estado?

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

0
265
+250

This post already has answers, but I am adding my view with a few pictures from Kafka Definitive Guide

Before answering the questions, let's look at an overview of producer components:

descripción general de los componentes del productor

1. When a producer is producing a message - It will specify the topic it wants to send the message to, is that right? Does it care about partitions?

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

  • ID de partición, si se especifica en el mensaje
  • particiones clave% num , 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 el valor está disponible

2. When a subscriber is running - Does it specify its group id so that it can be part of a cluster of consumers of the same topic or several topics that this group of consumers is interested in?

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

3. Does each consumer group have a corresponding partition on the broker or does each consumer have one?

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, por lo que se pueden asignar varias particiones a uno de los consumidores del grupo. número de consumidores menos que particiones temáticas
  • El número de consumidores es el mismo que el número de particiones de temas, luego el mapeo de particiones y consumidores puede ser como se muestra a continuación, número de consumidores igual al número de particiones de tema
  • El número de consumidores es mayor que el número de particiones de tema, entonces el mapeo de particiones y consumidores se puede ver a continuación, No es efectivo, verifique Consumidor 5 número de consumidores más que número de particiones de tema

4. As the partitions created by the broker, therefore not a concern for the consumers?

El consumidor debe conocer la cantidad de particiones, como se discutió en la pregunta 3.

5. Since this is a queue with an offset for each partition, is it responsibility of the consumer to specify which messages it wants to read? Does it need to save its state?

Kafka (para ser coordinador de grupo específico ) se encarga del estado de desplazamiento produciendo un mensaje a un tema interno __consumer_offsets , este comportamiento se puede configurar en manual también estableciendo enable.auto.commiten false. En ese caso consumer.commitSync()y consumer.commitAsync()puede ser útil para la gestión de desplazamiento.

Más sobre Coordinador de grupo :

  1. Es uno de los agentes elegidos en el clúster del lado del servidor de Kafka.
  2. Los consumidores interactúan con el Coordinador de grupo para las confirmaciones de compensación y las solicitudes de recuperación.
  3. El consumidor envía latidos periódicos al coordinador del grupo.

6. What happens when a message is deleted from the queue? - For example: The retention was for 3 hours, then the time passes, how is the offset being handled on both sides?

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(comenzar a procesar nuevos mensajes) porque todos los mensajes caducaron en ese momento y la retención es la configuración a nivel de tema.

9
  • dieciséis
    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 aclaran las cosas un 200%. ¿Crees que deberíamos fusionarnos? C4stor 24/08/18 a las 12:20
  • 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 respuesta principal (actualmente). ¡Pero no lo haría sin tu consentimiento! C4stor 24/08/18 a las 16:35
  • ¿Por qué no se pueden asignar varios consumidores a una partición? ¿Para garantizar que el mensaje solo se procese por una vez? Gracias por tu respuesta. g10guang 13/11/18 a las 8:07
  • 1
    @ g10guang: Es debido a la dificultad de confirmar el mantenimiento de la compensación . mrsrinivas 13/11/18 a las 10:37
  • 3
    Otro escenario. Puede tener UNA partición y MÚLTIPLES consumidores suscritos / asignados a ella. El corredor entregará los registros únicamente al primer consumidor registrado. Pero supongamos que el primer consumidor tarda más en procesar la tarea que el intervalo de sondeo. El consumo récord no está comprometido con el corredor. El corredor entiende que el consumidor se quedó. En este estado, el broker desencadena un reequilibrio enviando las nuevas particiones asignadas a todos sus consumidores. Otro consumidor vuelve a consumir el mensaje, aunque C1 todavía lo está procesando. Ten cuidado. Ruben Daddario 25 de septiembre de 2019 a las 14:06
144

Vamos a ponerlos en orden :)

1 - When a producer is producing a message - It will specify the topic it wants to send the message to, is that right? Does it care about partitions?

De forma predeterminada, al productor no le importa la partición. Tienes la opción de usar un particionador personalizado para tener un mejor control, pero es totalmente opcional.


2 - When a subscriber is running - Does it specify its group id so that it can be part of a cluster of consumers of the same topic or several topics that this group of consumers is interested in?

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


3 - Does each consumer group have a corresponding partition on the broker or does each consumer have one?

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


4 - Are the partitions created by the broker, therefore not a concern for the consumers?

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 máximo de paralelismo para consumir.


5 - Since this is a queue with an offset for each partition, is it responsibility of the consumer to specify which messages it wants to read? Does it need to save its state?

Sí, los consumidores ahorran un desplazamiento por tema por partición. Kafka se encarga totalmente de esto, no se preocupe.


6 - What happens when a message is deleted from the queue? - For example: The retention was for 3 hours, then the time passes, how is the offset being handled on both sides?

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

2
  • 3
    Sry :) Es un poco difícil explicar todo el proceso de kafka en cuadros 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 esas se guardan en otro lugar. C4stor 28 de junio de 2016 a las 8:22
  • Acabo de leer esto y todavía 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 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 controlado periódicamente. Esto hace que el equivalente a los reconocimientos de mensajes sea muy económico. Pinidbest 28 de junio de 2016 a las 12:02
25

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

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

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

Los mensajes de la partición tienen un número de identificación secuencial que identifica de forma ú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 cabrá en un solo servidor (un intermediario) y actuará 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 solicita una parte de las particiones.

Cada partición se replica en una cantidad configurable de intermediarios para garantizar la tolerancia a fallas.

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

5
  • 1
    ¿La partición es solo para el equilibrio de carga del tema? g10guang 13/11/18 a las 8:04
  • 1
    @ g10guang: las particiones también ayudan a procesar mensajes en paralelo. mrsrinivas 21/01/19 a las 14:50
  • Por favor corríjame si me equivoco, cuando un productor envía un mensaje y cuando aparece en el tema, lo copia en las particiones según las configuraciones y luego el consumidor lo consume. ¿Derecha? Atul 2/09/19 a las 11:57
  • 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ónKevin Hooke 6/12/19 a las 0:46
  • @Kevin Hooke, gracias por la explicación y por aclarar mi comprensión. Atul 6 de diciembre de 2019 a las 3:58
0
  1. Cuando un productor está produciendo un mensaje, especificará el tema al que desea enviar el mensaje, ¿es así? ¿Le importan las particiones?

Sí, el productor especifica el tema.

producer.send(new ProducerRecord<byte[],byte[]>(topic,  partition, key1, value1) , callback);

Cuantas más particiones haya en un clúster de Kafka, mayor será el rendimiento que se puede lograr. Una fórmula aproximada para elegir el número de particiones se basa en el rendimiento. Mide todo lo que puede lograr en una sola partición para producción (llámelo p) y consumo (llámelo c).


  1. Cuando un suscriptor se está ejecutando, ¿especifica su ID de grupo para que pueda ser parte de un grupo de consumidores del mismo tema o de varios temas que le interesan a este grupo de consumidores?

Cuando se construye el consumidor de Kafka y group.id aún no existe (es decir, no hay consumidores existentes que formen parte del grupo), el grupo de consumidores se creará automáticamente. Si todos los consumidores de un grupo abandonan el grupo, el grupo se destruye automáticamente.


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

A cada grupo de consumidores se le asigna una partición, varios grupos de consumidores pueden acceder a una sola partición, pero no se asigna la misma partición a 2 consumidores que pertenecen a un grupo de consumidores porque el consumidor consume mensajes secuencialmente en un grupo y si varios consumidores de un solo grupo consumen mensajes de la misma partición, entonces la secuencia podría perderse, mientras que los grupos que son lógicamente independientes pueden consumir de la misma partición.


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

Los corredores ya tienen particiones. Cada corredor debe tener hasta 4,000 particiones y cada clúster debe tener hasta 200,000 particiones.

Siempre que un consumidor ingresa o sale de un grupo de consumidores, los corredores reequilibran las particiones entre los consumidores, lo que significa que Kafka maneja el equilibrio de carga con respecto al número de particiones por instancia de aplicación por usted.

Antes de asignar particiones a un consumidor, Kafka primero verificaría si hay consumidores existentes con el ID de grupo dado. Cuando no hay consumidores existentes con el ID de grupo dado, asignaría todas las particiones de ese tema a este nuevo consumidor. Cuando ya hay dos consumidores con el ID de grupo dado y un tercer consumidor quiere consumir con el mismo ID de grupo. Asignaría las particiones por igual entre los tres consumidores. No se asignarían dos consumidores del mismo ID de grupo a la misma fuente de partición


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

La compensación es gestionada internamente por Kafka. El desplazamiento actual es un indicador del último registro que Kafka ya envió a un consumidor en la encuesta más reciente. Por lo tanto, el consumidor no obtiene el mismo registro dos veces debido a la compensación actual. No es necesario especificarlo exclusivamente


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

Se reconfigura automáticamente según las necesidades. Debería dar un error.