es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no se revocan adecuadamente todos los consumidores antes de asignar nuevas particiones dentro de un único grupo?

Se considera que hay 4 consumidores (A, B, C, D). C se cierra llamando a close (). Idealmente, las particiones asignadas a A, B y D deberían ser revocadas antes de asignar cualquier partición nueva, pero A está siendo revocada y recibiendo nuevas particiones, y luego B está siendo revocada. ¿Por qué se observa este comportamiento? ¿Cómo se puede resolver?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Observación

    El comportamiento observado se debe al protocolo de reequilibrio que utiliza Apache Kafka para redistribuir las particiones entre los consumidores disponibles en un grupo de consumidores.

    Cuando un consumidor sale o se une a un grupo de consumidores, se desencadena un reequilibrio y se realocan las particiones entre los consumidores restantes. Durante el proceso de reequilibrio, todos los consumidores están en el estado “reequilibrio en progreso” y no pueden consumir mensajes.

    En este escenario, cuando el consumidor C se cierra llamando a close(), se desencadena un reequilibrio y las particiones se realocan entre los consumidores restantes (A, B y D). Sin embargo, solo las particiones del consumidor C deberían haber sido revocadas. Pero aquí, también se revocan las particiones de A y luego se revocan las de B.

    Solución

    Para resolver este comportamiento, hay dos posibles soluciones:

    Solución 1: Cerrar solo el consumidor C

    En lugar de llamar a close() en el consumidor C, sólo hay que cancelar la suscripción del consumidor a los temas suscritos. Esto eliminará las particiones de la asignación del consumidor y el consumidor no participará en el reequilibrio.

    consumerC.unsubscribe();
    

    Solución 2: Utilizar la asignación de particiones pegajosa

    En este enfoque, el coordinador del grupo de consumidores de Kafka garantiza que cada partición se asigna al mismo consumidor mientras éste siga activo y disponible. Esto garantiza que los consumidores no obtengan innecesariamente nuevas particiones asignadas y no liberen particiones que siguen activas.

    Para utilizar este enfoque, configure la propiedad partition.assignment.strategy en “org.apache.kafka.clients.consumer.StickyAssignor” en la configuración del consumidor.

    props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.StickyAssignor");
    

    Al utilizar la asignación de particiones pegajosa, el coordinador del grupo de consumidores de Kafka garantiza que las particiones asignadas al consumidor A no se reasignen a otros consumidores hasta que A se cierre, y lo mismo para B y D. Por lo tanto, cuando se cierra el consumidor C, sus particiones se reasignan a uno de los consumidores restantes (A, B o D), sin afectar a las particiones ya asignadas.

Comments are closed.