Los rebalanceos frecuentes de consumidores suelen deberse a un procesamiento lento de mensajes, parámetros de consumidor mal configurados o una versión de cliente obsoleta. La causa raíz y la solución varían según la versión del cliente.
Síntoma
Se producen rebalanceos frecuentes en el cliente consumidor al usar ApsaraMQ for Kafka.
Causa
La causa raíz depende de la versión del cliente, ya que el mecanismo de latidos difiere entre versiones.
Clientes anteriores a la versión 0.10.1.0: no existe un hilo dedicado para los latidos. Estos se envían dentro de la llamada a
poll(). Cuando el procesamiento de mensajes tarda más quesession.timeout.ms, el broker no recibe ningún latido, elimina al consumidor del grupo y desencadena un rebalanceo.Clientes de la versión 0.10.1.0 o posteriores: un hilo dedicado envía latidos de forma independiente al procesamiento de mensajes. Sin embargo, si el consumidor no llama a
poll()dentro del intervalo definido pormax.poll.interval.ms(valor predeterminado: 5 minutos), el cliente abandona el grupo de consumidores y se desencadena un rebalanceo. El valor predeterminado demax.poll.interval.mses de 5 minutos. Esta situación ocurre normalmente cuando el procesamiento de un lote de mensajes toma demasiado tiempo.
A continuación se muestran los mensajes de error asociados comúnmente con los rebalanceos. Identificar el error específico le ayudará a localizar la causa raíz con mayor rapidez:
**
NOT_COORDINATOR/join group failed**: indica que el coordinador de grupo cambió (por ejemplo, debido a un failover del broker) o que un tiempo de espera agotado en los latidos provocó la eliminación del consumidor del grupo. El consumidor intenta reincorporarse al grupo, lo cual desencadena un rebalanceo.**
MemberIdRequiredException/consumer poll timeout**: en clientes anteriores a la versión 0.10.1.0, este error suele deberse a un consumidor bloqueado que impide el envío de latidos. En clientes de la versión 0.10.1.0 o posteriores, señala que un procesamiento lento de mensajes hizo que el consumidor superaramax.poll.interval.mssin llamar apoll(), lo que obliga al cliente a abandonar el grupo de consumidores.**
CommitFailedException**: indica que el consumidor tardó demasiado en procesar los mensajes o no logró enviar los latidos a tiempo. El broker elimina al consumidor del grupo (y desencadena un rebalanceo) antes de que finalice la confirmación del desplazamiento.
Parámetros clave
Los siguientes parámetros controlan el comportamiento de los rebalanceos:
|
Parámetro |
Versiones aplicables |
Descripción |
|
|
Todas |
Tiempo de espera de la sesión. Si no se recibe ningún latido durante este periodo, el broker elimina al consumidor del grupo de consumidores. |
|
|
Todas |
Número máximo de mensajes devueltos por cada llamada al método |
|
|
0.10.1.0 o posterior |
Intervalo máximo entre dos llamadas consecutivas al método |
|
|
0.10.1.0 o posterior |
Intervalo con el que el consumidor envía latidos al broker. Debe ser menor que |
Soluciones
-
Ajuste los valores de los parámetros/@cmd
Configure los siguientes parámetros según la versión de su cliente:
**
session.timeout.ms**Versión del cliente
Valor recomendado
Anterior a 0.10.1.0
Mayor que el tiempo necesario para procesar un lote de mensajes, pero sin exceder los 30 segundos. Se recomiendan 25 segundos.
0.10.1.0 o posterior
Conserve el valor predeterminado de 10 segundos.
**
max.poll.records**Establezca este valor muy por debajo del resultado de la siguiente fórmula:
max.poll.records << messages_per_thread_per_second * number_of_threads * max.poll.interval.ms**
max.poll.interval.ms** (solo para la versión 0.10.1.0 o posterior)Establezca este valor por encima del resultado de la siguiente fórmula:
max.poll.interval.ms > max.poll.records / (messages_per_thread_per_second * number_of_threads)**
heartbeat.interval.ms** (versión 0.10.1.0 o posterior)Establezca
heartbeat.interval.msen un máximo de 10 000 milisegundos (10 segundos). Este valor controla la frecuencia con la que el consumidor envía latidos al broker y siempre debe ser menor quesession.timeout.ms. Una práctica habitual consiste en fijarlo en un tercio desession.timeout.ms.Configuración de parámetros en Spring Kafka
Si utiliza Spring Kafka, configure todos los parámetros anteriores en el archivo
application.yml:spring: kafka: consumer: properties: session.timeout.ms: 10000 heartbeat.interval.ms: 3000 max.poll.interval.ms: 300000 max.poll.records: 50Ajuste los valores para que coincidan con su throughput de consumo. El valor de
max.poll.interval.msdebe superar el tiempo necesario para procesar un solo lote demax.poll.recordsmensajes. -
Mejore la velocidad de consumo y separe los hilos de procesamiento/@cmd
Traslade el procesamiento de mensajes a un hilo dedicado para que el hilo del consumidor pueda llamar a
poll()de manera puntual. Esto evita que un procesamiento lento bloquee los latidos o supere el intervalo de sondeo. -
Reduzca la cantidad de temas por grupo de consumidores/@cmd
Mantenga cada grupo de consumidores suscrito a un máximo de cinco temas. Para lograr una estabilidad óptima, suscriba un solo tema por grupo de consumidores.
-
Actualice a la versión 0.10.1.0 o posterior/@cmd
Los clientes anteriores a la versión 0.10.1.0 carecen de un hilo dedicado para los latidos, por lo que son vulnerables a tiempos de espera agotados durante cargas de procesamiento intensas. Al actualizar a la versión 0.10.1.0 o posterior, se desacopla el envío de latidos del procesamiento de mensajes y se elimina este tipo de rebalanceos.
Preguntas frecuentes
P: ¿Cómo reduzco temporalmente los rebalanceos para acelerar el consumo de mensajes acumulados?
Siga estos pasos para minimizar los rebalanceos y limpiar la acumulación de mensajes lo más rápido posible:
Utilice un cliente de la versión 0.10.1.0 o posterior. Los clientes anteriores a esta versión carecen de un hilo dedicado para los latidos y tienden a generar rebalanceos bajo cargas intensas. Actualice antes de ajustar otros parámetros.
**Aumente
max.poll.interval.ms** hasta un valor superior al tiempo máximo necesario para procesar un solo lote de mensajes. Así evitará que el consumidor se considere inactivo durante un procesamiento intenso.**Disminuya
max.poll.records** para reducir la cantidad de mensajes obtenidos en cada llamada apoll(). Los lotes más pequeños terminan más rápido y reducen el riesgo de superarmax.poll.interval.ms.Reduzca la cantidad de temas suscritos por grupo de consumidores. Limite las suscripciones a cinco temas o menos. Para lograr una estabilidad óptima, suscriba un solo tema por grupo de consumidores.
Evite bloquear el hilo del consumidor. Traslade la lógica de procesamiento de mensajes a un hilo asíncrono independiente para que el hilo del consumidor quede libre y llame a
poll()de manera puntual.