Todos los productos
Search
Centro de documentos

ApsaraMQ for Kafka:Best practices for consumers

Última actualización: Sep 04, 2026

Cuando los consumidores se retrasan respecto a los productores, los mensajes se acumulan y la latencia de procesamiento aumenta considerablemente. Una configuración incorrecta de los offsets puede provocar que los mensajes se omitan o se reprocesen sin generar alertas. Esta guía describe patrones comprobados para desarrollar aplicaciones de consumo confiables y de alto rendimiento en ApsaraMQ for Kafka, e incluye temas como grupos de consumidores, gestión de offsets, manejo de errores y ajuste de rendimiento.

Funcionamiento del consumo de mensajes

Un consumidor de ApsaraMQ for Kafka repite un ciclo de tres pasos:

  1. Sondeo: recupera un lote de mensajes del broker.

  2. Procesamiento: ejecuta la lógica de negocio sobre los mensajes recuperados.

  3. Nuevo sondeo: obtiene el siguiente lote una vez que finaliza el procesamiento.

Consumer polling cycle

Mantenga el tiempo de procesamiento breve para conservar un intervalo de sondeo constante. Los retrasos prolongados en el procesamiento desencadenan reequilibrios o provocan la acumulación de mensajes.

Grupos de consumidores y balanceo de carga

Un grupo de consumidores es un conjunto de instancias de consumidor que comparten el mismo group.id. ApsaraMQ for Kafka distribuye las particiones de los topics suscritos de manera uniforme entre los consumidores del grupo, de modo que cada mensaje se entrega a un único consumidor.

Ejemplo: El Grupo A se suscribe al Topic A. Tres consumidores (C1, C2 y C3) forman parte del grupo. Cada mensaje entrante se dirige a C1, C2 o C3, lo que equilibra la carga de consumo entre los tres.

ApsaraMQ for Kafka inicia un reequilibrio cuando los consumidores:

  • Se inician por primera vez

  • Se reinician

  • Se agregan o eliminan del grupo

Cómo evitar reequilibrios frecuentes

Los reequilibrios pausan el consumo mientras se reasignan las particiones. Si ocurren con frecuencia, afectan el rendimiento y aumentan la latencia de procesamiento. Esto sucede cuando los heartbeats de los consumidores exceden el tiempo de espera.

Para evitar reequilibrios frecuentes, ajuste los parámetros correspondientes o incremente la velocidad de consumo. Para consultar los pasos detallados de solución de problemas, consulte Why do rebalances frequently occur on my consumer client?

Configuración de particiones

El número de particiones determina cuántos consumidores pueden procesar mensajes en paralelo. Cada partición se asigna a un solo consumidor dentro de un grupo; si hay más consumidores que particiones, los consumidores adicionales permanecerán inactivos.

Número recomendado de particiones

El número predeterminado de particiones en la consola de ApsaraMQ for Kafka es 12, valor adecuado para la mayoría de las cargas de trabajo. Al escalar, siga estas recomendaciones:

Número de particiones

Impacto

Menos de 12

Puede reducir el rendimiento en la producción y el consumo de mensajes

12 -- 100

Rango recomendado para la mayoría de las cargas de trabajo

Más de 100

Puede provocar reequilibrios frecuentes de consumidores

Importante

No es posible reducir el número de particiones después de haberlo incrementado. Aumente las particiones de forma gradual en lugar de hacerlo en saltos grandes.

Patrones de suscripción

ApsaraMQ for Kafka admite dos patrones de suscripción.

Un grupo se suscribe a varios topics

Un solo grupo de consumidores puede suscribirse a múltiples topics. Los mensajes de todos los topics suscritos se distribuyen equitativamente entre los consumidores del grupo.

String topicStr = kafkaProperties.getProperty("topic");
String[] topics = topicStr.split(",");
for (String topic: topics) {
    subscribedTopics.add(topic.trim());
}
consumer.subscribe(subscribedTopics);

Varios grupos se suscriben a un topic

Varios grupos de consumidores pueden suscribirse de forma independiente al mismo topic. Cada grupo recibe todos los mensajes y opera sin afectar a los demás.

Utilice este patrón cuando distintas aplicaciones necesiten procesar el mismo flujo de datos de manera independiente; por ejemplo, un grupo para análisis en tiempo real y otro para archivado de datos.

Mantenga un grupo por aplicación

Use un grupo de consumidores exclusivo para cada aplicación. Si una sola aplicación debe ejecutar diferentes lógicas de consumo, cree archivos de configuración separados (por ejemplo, kafka1.properties y kafka2.properties) con valores distintos de group.id.

Coincidencia de suscripciones dentro de un grupo

Todos los consumidores de un mismo grupo deben suscribirse al mismo conjunto de topics. Las suscripciones no coincidentes complican la solución de problemas y pueden causar comportamientos inesperados durante el reequilibrio.

Gestión de offsets de consumidor

Cada partición registra un offset máximo, que representa el número total de mensajes recibidos. Cada consumidor lleva un offset de consumidor, que indica la cantidad de mensajes que ha procesado en esa partición. La diferencia entre ambos valores corresponde a la acumulación de mensajes (mensajes pendientes de consumo).

Confirmación automática frente a confirmación manual

ApsaraMQ for Kafka ofrece dos parámetros para confirmar los offsets de consumidor:

Parámetro

Valor predeterminado

Descripción

enable.auto.commit

true

Habilita la confirmación automática de offsets

auto.commit.interval.ms

1000 (ms)

Intervalo entre confirmaciones automáticas

Con la confirmación automática habilitada, el cliente verifica el tiempo transcurrido desde la última confirmación antes de cada sondeo. Si el tiempo supera el valor de auto.commit.interval.ms, confirma el offset actual.

Importante

Al usar la confirmación automática, asegúrese de que todos los mensajes del sondeo anterior se hayan procesado por completo antes del siguiente. Si el consumidor escribe en un almacén de datos externo y esa escritura falla, la confirmación automática podría avanzar el offset de todos modos, lo que provocaría que esos mensajes se omitan permanentemente en lugar de reintentarse. Comprenda esta contrapartida antes de depender del comportamiento predeterminado.

Confirmación manual de offsets

Para confirmar los offsets manualmente, establezca enable.auto.commit en false y llame a la función commit(offsets) después de procesar cada lote.

Comportamiento de restablecimiento de offsets

Los offsets de consumidor se restablecen en dos situaciones:

  • No existe un offset confirmado: por ejemplo, cuando un consumidor se conecta a un broker por primera vez.

  • El offset confirmado no es válido: por ejemplo, el offset máximo en una partición es 10, pero el consumidor intenta leer desde el offset 11.

Controle el comportamiento de restablecimiento en clientes Java mediante auto.offset.reset:

Valor

Comportamiento

latest

Inicia desde el mensaje más reciente. Úselo como valor predeterminado

earliest

Inicia desde el mensaje disponible más antiguo

none

Lanza una excepción en lugar de restablecer el offset

Nota

Prefiera latest en lugar de earliest para evitar reprocesar todo el historial del topic cuando se presenta un offset no válido. Si confirma los offsets manualmente con la función commit(offsets), none es una opción segura, ya que sus offsets siempre deberían ser válidos.

Manejo de mensajes grandes

Cuando algunos mensajes superan los tamaños habituales, ajuste los siguientes parámetros para controlar el comportamiento de recuperación:

Parámetro

Recomendación

max.poll.records

Número máximo de registros por sondeo. Establézcalo en 1 para mensajes mayores a 1 MB

fetch.max.bytes

Cantidad máxima de datos por solicitud de recuperación. Configúrelo ligeramente por encima del tamaño esperado del mensaje

max.partition.fetch.bytes

Cantidad máxima de datos por partición en cada recuperación. Configúrelo ligeramente por encima del tamaño esperado del mensaje

Con esta configuración, el consumidor recupera los mensajes grandes uno por uno, lo que evita la presión sobre la memoria causada por lotes demasiado grandes.

Manejo de duplicación de mensajes

ApsaraMQ for Kafka utiliza una semántica de entrega at-least-once: cada mensaje se entrega al menos una vez para evitar la pérdida de datos, pero pueden producirse duplicados durante errores de red o reinicios del cliente.

Implementación de consumo idempotente

Si su aplicación es sensible a los duplicados (por ejemplo, transacciones financieras o procesamiento de pedidos), implemente la deduplicación a nivel de aplicación:

  1. Asigne una clave única a cada mensaje durante la producción (por ejemplo, un ID de transacción).

  2. Antes de procesar un mensaje consumido, compruebe si la clave ya se procesó.

  3. Omita los mensajes cuyas claves ya hayan sido procesadas.

Si su aplicación tolera duplicados ocasionales (por ejemplo, agregación de métricas o ingesta de registros), omita este paso.

Manejo de errores de consumo

Los mensajes dentro de una partición se consumen de forma secuencial. Cuando el procesamiento falla (por ejemplo, debido a datos malformados o a la caída de un servicio posterior), elija una de las siguientes estrategias:

Estrategia

Contrapartida

Reintento en el mismo lugar

Reintenta el mensaje fallido hasta que tenga éxito. Es sencilla de implementar, pero bloquea el hilo del consumidor y provoca acumulación de mensajes en esa partición

Topic de mensajes muertos

Envía los mensajes fallidos a un topic dedicado para su inspección posterior. El consumo continúa sin bloqueos, pero requiere un proceso separado para investigar y reprocesar los fallos

Para la mayoría de las cargas de trabajo en producción, el enfoque de mensajes muertos evita que se detenga el pipeline de consumo.

Reducción de la latencia de consumo

ApsaraMQ for Kafka emplea un modelo basado en extracción: los consumidores recuperan mensajes del broker en cada ciclo de sondeo. Cuando los consumidores mantienen el ritmo de los productores, la latencia se mantiene baja. Un aumento repentino en la latencia suele indicar acumulación de mensajes.

Causas comunes de acumulación

Causa

Solución

La velocidad de consumo es menor que la de producción

Agregue consumidores o incremente el rendimiento del procesamiento

El hilo del consumidor está bloqueado por una llamada remota lenta

Configure tiempos de espera en las llamadas externas para liberar el hilo tras una espera acotada

Incremento del rendimiento de consumo

Agregue más consumidores. Inicie instancias adicionales de consumidores (un hilo por consumidor) o despliegue más procesos de consumo. El número de consumidores activos no puede superar el número de particiones; los excedentes permanecerán inactivos.

Utilice un pool de hilos para el procesamiento. Desacople el sondeo del procesamiento para paralelizar el trabajo:

  1. Defina un pool de hilos con un número fijo de hilos de trabajo.

  2. Recupere un lote de mensajes mediante sondeo.

  3. Envíe cada mensaje al pool de hilos para su procesamiento concurrente.

  4. Una vez completadas todas las tareas del lote, recupere el siguiente.

Este patrón mantiene la capacidad de respuesta del bucle de sondeo mientras distribuye el trabajo de procesamiento entre varios hilos.

Filtrado de mensajes

ApsaraMQ for Kafka no proporciona filtrado de mensajes integrado. Implemente el filtrado a nivel de aplicación mediante uno de los siguientes enfoques:

Enfoque

Cuándo utilizarlo

Topics separados

Cuando hay pocas categorías de mensajes bien definidas

Filtrado en el cliente

Cuando existen muchas categorías o la lógica de filtrado cambia con frecuencia

Combine ambos enfoques cuando su caso de uso lo requiera: dirija categorías amplias a distintos topics y aplique filtros más específicos en el lado del consumidor.

Difusión de mensajes

ApsaraMQ for Kafka no admite de forma nativa la difusión de mensajes. Para entregar cada mensaje a múltiples consumidores independientes, cree un grupo de consumidores separado para cada consumidor que deba recibir todos los mensajes. Cada grupo consume de forma independiente el flujo completo de mensajes del topic.