Kafka: grupo de consumidores único en varias instancias

6

Estoy trabajando para implementar una solución basada en Kafka para nuestra aplicación. Según la documentación de Kafka, lo que entiendo es que un consumidor en un grupo de consumidores (que es un hilo) se asigna internamente a una partición en el tema suscrito.

Digamos que tengo un tema con 40 particiones y tengo un consumidor de alto nivel ejecutándose en 4 instancias. No quiero que una instancia consuma los mismos mensajes consumidos por otra instancia. Pero si una instancia falla, las otras tres instancias deberían poder procesar todos los mensajes.

  • ¿Debería optar por el mismo grupo de consumidores con 10 subprocesos por instancia? - Stackoverflow dice que el mismo grupo de consumidores entre las instancias actúa como un mecanismo de cola síncrono tradicional

En Apache Kafka, ¿por qué no puede haber más instancias de consumidor que particiones?

  • ¿O debería elegir un grupo de consumidores diferente por instancia?

El uso de un consumidor simple o de un consumidor de bajo nivel da control sobre la partición, pero luego, si una instancia falla, las otras tres instancias no procesarían los mensajes de las particiones consumidas en la primera instancia.

13

First to explain the concept of Consumers & Consumer Groups,

Los consumidores se etiquetan a sí mismos con un nombre de grupo de consumidores, y cada registro publicado en un tema se entrega a una instancia de consumidor dentro de cada grupo de consumidores suscriptor.

La carga de los registros se equilibrará de forma eficaz en las instancias de consumidores de un grupo de consumidores. Si todas las instancias de consumidores tienen diferentes grupos de consumidores, cada registro se transmitirá a todos los procesos de consumidores.

La forma en que se implementa el consumo en Kafka es dividiendo las particiones en el registro entre las instancias del consumidor para que cada instancia sea el consumidor exclusivo de una "parte justa" de particiones en cualquier momento. Si nuevas instancias se unen al grupo, tomarán el control de algunas particiones de otros miembros del grupo; si una instancia muere, sus particiones se distribuirán a las instancias restantes.

Now to answer your questions,

1. No quiero que una instancia consuma los mismos mensajes consumidos por otra instancia. Pero si una instancia falla, las otras tres instancias deberían poder procesar todos los mensajes.

Esto es posible de forma predeterminada en la arquitectura de Kafka. Solo tiene que etiquetar las 4 instancias con el mismo nombre de grupo de consumidores.

2. ¿Debería optar por el mismo grupo de consumidores con 10 subprocesos por instancia?

Hacer esto asignará a cada hilo una partición kafka de la que consumirá datos, lo cual es óptimo. Reducir el número de subprocesos equilibrará la carga de la distribución de registros entre las instancias de consumidor y PUEDE sobrecargar algunas de las instancias de consumidor.

3. En Apache Kafka, ¿por qué no puede haber más instancias de consumidor que particiones?

En Kafka, una partición se puede asignar solo a una instancia de consumidor. Por lo tanto, la creación de más instancias de consumidores que particiones conducirá a consumidores inactivos que no consumirán ningún registro de kafka.

4. ¿Debería elegir un grupo de consumidores diferente por instancia?

No. Esto dará lugar a la duplicación de los registros, ya que cada registro se enviará a todas las instancias, ya que pertenecen a diferentes grupos de consumidores.

Espero que esto aclare tus dudas.

5
  • Gracias por tu explicación. Así que creo que debería elegir la primera opción para mi caso de uso. Si hay un aumento en la partición, eventualmente deberíamos aumentar el número de subprocesos del consumidor 16 de junio de 2017 a las 14:00
  • Si. Pero trate de asegurarse de que sus hilos de consumo no sean más que las particiones como se explica en el punto 3. 16 de junio de 2017 a las 14:10
  • @DaniccanVP Basándose en la respuesta n. ° 1, ¿es posible que varios consumidores procesen los mensajes de forma serializada? es decir, si un mensaje está siendo procesado por una instancia, otro debe esperar. Esto es necesario por motivos de alta disponibilidad. 3 oct 2017 a las 8:48
  • @TechEnthusiast Los consumidores consumen de particiones en el tema en paralelo en un grupo de consumidores. Sin embargo, un consumidor consumirá mensajes de su partición asignada en orden secuencial. Espero que esto responda a su pregunta. 4 oct 2017 a las 12:19
  • @DaniccanVP si NO podemos crear múltiples particiones, ya que necesitamos una secuenciación sólida de todos los mensajes, ¿pueden 3 consumidores procesar los mensajes un proceso a la vez? 6/10/2017 a las 16:37
0

Hay algunas cosas a tener en cuenta al diseñar su sistema de eco Kafka:

  1. El consumidor es esencialmente un hilo y no desea que varios hilos intenten cambiar su marca de desplazamiento. Es por eso que el sistema de consumo debe diseñarse como un solo consumidor, un hilo.

  2. Comisiones de compensación, existe un delicado equilibrio entre la frecuencia con la que desea realizar las confirmaciones de compensación. Si la frecuencia es más alta, tendrá un efecto adverso en el rendimiento de su sistema (Zk será el cuello de botella). Si la frecuencia es dos veces baja, puede correr el riesgo de duplicar los mensajes.

0

En Kafka, tiene ambas formas de hacer patrones de consumidores competidores y de publicación y suscripción:

  • consumidores competidores: es posible poner a los consumidores dentro del mismo grupo de consumidores. Para que cada partición sea accesible por un solo consumidor (por supuesto, un consumidor puede leer más de una partición). Significa que no puede tener más consumidores que particiones en un grupo de consumidores, porque los otros consumidores estarán inactivos sin que se les asigne ninguna partición. Por supuesto, si un consumidor del grupo de consumidores cae, uno de los consumidores inactivos tomará la partición.
  • publicar suscribirse: si tiene diferentes grupos de consumidores, todos los consumidores de diferentes grupos de consumidores recibirán los mismos mensajes. Entonces, dentro del grupo de consumidores, se aplicará el patrón anterior.
1
  • Tengo una situación en la que quiero un grupo de consumidores diferente para cada instancia / pod de mi aplicación. ¿Cómo puedo lograr esto? Mi aplicación está implementada en Kubernetes. Si supongo que aumento las réplicas en k8s, cada pod adicional debería consumirse utilizando un nuevo grupo de consumidores. La aplicación está escrita en nodejs. 21 de mayo a las 9:33