Cuando varios consumidores de un grupo extraen mensajes de un tema, ApsaraMQ for RocketMQ distribuye esos mensajes entre los consumidores mediante una política de balanceo de carga. Esto mejora el rendimiento y simplifica el escalado horizontal.
Elegir una política de balanceo de carga
ApsaraMQ for RocketMQ ofrece dos políticas de balanceo de carga. La política aplicable depende del tipo de consumidor y de la versión del broker.
|
Política |
Predeterminada para |
Granularidad |
Recomendada para |
|
Basada en mensajes |
Push Consumer, Simple Consumer (broker 5.x) |
Mensajes individuales |
Cargas de trabajo orientadas a eventos where cada mensaje se procesa de forma independiente |
|
Basada en colas |
Pull Consumer (broker 3.x/4.x/5.x) |
Colas completas |
Cargas de trabajo de procesamiento de flujos y agregación por lotes |
Tip: Si sus consumidores procesan los mensajes uno por uno, el balanceo de carga basado en mensajes proporciona una distribución más uniforme y operaciones más sencillas. Si sus consumidores agregan o procesan por lotes mensajes de una sola fuente, utilice el balanceo de carga basado en colas.
Contexto
Comprender estas políticas le ayuda a planificar:
Recuperación ante desastres: cómo se reintentan los mensajes y cómo funciona la conmutación por error cuando fallan los nodos locales.
Orden de los mensajes: cómo ApsaraMQ for RocketMQ mantiene un orden estricto FIFO (primero en entrar, primero en salir) dentro de un grupo de mensajes.
Escalado horizontal: cómo planificar la migración de tráfico y el escalado horizontal al agregar o eliminar consumidores.
Consumo por difusión frente a consumo por clúster
ApsaraMQ for RocketMQ admite dos modos de consumo. El balanceo de carga solo se aplica al consumo por clúster.
|
Modo |
Consumidores por grupo |
Entrega de mensajes |
Caso de uso |
Balanceo de carga |
|
Difusión |
Uno por grupo |
Cada grupo recibe todos los mensajes |
Envío from gateway, envío de configuración |
No aplica |
|
Clúster |
Varios por grupo |
Cada mensaje va a un consumidor |
Desacoplamiento de microservicios, escalado horizontal |
Basado en mensajes o basado en colas |

Consumo por difusión (lado izquierdo del diagrama): cada grupo de consumidores tiene un consumidor que recibe todos los mensajes. Los distintos grupos de consumidores reciben de forma independiente el flujo completo de mensajes.
Consumo por clúster (lado derecho del diagrama): un grupo de consumidores tiene varios consumidores y los mensajes se distribuyen entre ellos. Solo un consumidor del grupo procesa cada mensaje.
Balanceo de carga basado en mensajes
Funcionamiento
El broker distribuye mensajes individuales de un tema de manera uniforme entre todos los consumidores de un grupo, sin importar a qué cola pertenezcan. Varios consumidores pueden procesar mensajes de la misma cola simultáneamente.

En este ejemplo, el Grupo de Consumidores A tiene tres consumidores: A1, A2 y A3. Los tres consumen mensajes de Queue1. El broker asigna cada mensaje a un consumidor a la vez.
Cuando un consumidor recibe un mensaje, el broker bloquea ese mensaje para que sea invisible a otros consumidores. El mensaje permanece bloqueado hasta que el consumidor lo confirma o hasta que expire el tiempo de espera del bloqueo. Esto evita el procesamiento duplicado en condiciones normales.
Los mensajes se distribuyen bajo demanda en lugar de preasignarse. No es posible controlar qué consumidor específico recibe un mensaje determinado.
Manejo de mensajes ordenados
Para los mensajes ordenados, ApsaraMQ for RocketMQ garantiza que los mensajes dentro del mismo grupo se procesen en el orden exacto en que se almacenaron en el broker.

Considere cuatro mensajes ordenados (M1 a M4) en el grupo de mensajes G1 de Queue1. Si el consumidor A1 está procesando M1 y M2, el consumidor A2 no puede comenzar a procesar M3 o M4 hasta que A1 haya enviado el estado de consumo de M1 y M2. El broker aplica un bloqueo secuencial estricto para mantener el orden.
Ventajas sobre el balanceo de carga basado en colas
|
Ventaja |
Funcionamiento |
Importancia |
|
Distribución uniforme |
Los mensajes se asignan bajo demanda, por lo que todos los consumidores permanecen activos. |
Con el balanceo basado en colas, la falta de coincidencia entre la cantidad de colas y de consumidores puede dejar a algunos consumidores inactivos. |
|
Tolerancia a capacidades desiguales |
Los consumidores más lentos reciben menos mensajes automáticamente. |
Con el balanceo basado en colas, las diferencias en las condiciones de red o en las especificaciones de hardware pueden provocar que un consumidor lento asignado a una cola muy activa acumule retrasos mientras otros consumidores permanecen inactivos. |
|
Planificación de capacidad más sencilla |
No es necesario igualar la cantidad de colas con la cantidad de consumidores. |
Agregue o elimine consumidores libremente sin ajustar la cantidad de colas. |
Cuándo utilizarlo
El balanceo de carga basado en mensajes es adecuado para la mayoría de las cargas de trabajo de procesamiento de eventos en línea where cada mensaje se maneja de forma independiente; por ejemplo, procesamiento de pedidos, envío de notificaciones y manejo de eventos en tiempo real.
Para cargas de trabajo de procesamiento de flujos o agregación que requieren procesar por lotes mensajes de la misma cola, utilice el balanceo de carga basado en colas.
Alcance
El balanceo de carga basado en mensajes es la única política disponible para los tipos Push Consumer y Simple Consumer en la versión 5.x del broker. Está habilitado de forma predeterminada y no requiere configuración adicional.
Ejemplo
Los tipos Push Consumer y Simple Consumer utilizan el balanceo de carga basado en mensajes automáticamente. Los siguientes ejemplos en Java muestran ambos tipos de consumidores procesando mensajes sin ninguna configuración de balanceo de carga.
Push Consumer con un listener de mensajes:
// Push Consumer: implement a message listener to process messages.
// Load balancing is handled automatically by the broker.
MessageListener messageListener = new MessageListener() {
@Override
public ConsumeResult consume(MessageView messageView) {
System.out.println(messageView);
// Return the consumption result.
return ConsumeResult.SUCCESS;
}
};
Simple Consumer con confirmación manual:
// Simple Consumer: pull messages, process them, and acknowledge each one.
// Load balancing is handled automatically by the broker.
try {
List<MessageView> messageViewList = simpleConsumer.receive(10, Duration.ofSeconds(30));
messageViewList.forEach(messageView -> {
System.out.println(messageView);
try {
// Acknowledge the message after processing.
simpleConsumer.ack(messageView);
} catch (ClientException e) {
e.printStackTrace();
}
});
} catch (ClientException e) {
// If the pull fails due to throttling or other issues, retry the request.
e.printStackTrace();
}
Balanceo de carga basado en colas
Funcionamiento
El broker asigna cada cola de un tema a exactamente un consumidor del grupo. Luego, cada consumidor procesa todos los mensajes de sus colas asignadas.

En este ejemplo, un tema tiene tres colas (Queue1, Queue2, Queue3) y el grupo de consumidores tiene dos consumidores. Dado que cada cola se asigna a un consumidor, el consumidor A2 obtiene dos colas mientras que A1 obtiene una. Si hay menos colas que consumidores, algunos consumidores no reciben colas y permanecen inactivos.
Cada consumidor sigue esta secuencia de procesamiento: extraer mensajes de la cola asignada, enviar el desplazamiento de consumo y persistir el desplazamiento. Como el estado de consumo no se devuelve a la cola cuando un consumidor extrae mensajes, cada cola debe asignarse exclusivamente a un solo consumidor para evitar el procesamiento duplicado.
El balanceo de carga basado en colas está diseñado para que cada cola sea procesada por un consumidor. Sin embargo, la implementación depende del mecanismo de negociación de información entre el consumidor y el broker. ApsaraMQ for RocketMQ no garantiza que los mensajes de una cola sean procesados por un solo consumidor. Cuando cambian las cantidades de consumidores o de colas, pueden ocurrir inconsistencias temporales en la asignación de colas, y una pequeña cantidad de mensajes podría procesarse más de una vez. Implemente siempre un manejo idempotente de mensajes.
Ventajas sobre el balanceo de carga basado en mensajes
|
Ventaja |
Funcionamiento |
Importancia |
|
Afinidad de cola |
Todos los mensajes de una cola van al mismo consumidor. |
Permite la agregación local y el procesamiento por lotes dentro de un solo consumidor. |
|
Compatibilidad con procesamiento de flujos |
Los consumidores mantienen un procesamiento con estado sobre un flujo continuo de la misma cola. |
Admite cálculos por ventanas de tiempo y agregaciones continuas. |
Cuándo utilizarlo
El balanceo de carga basado en colas es ideal para aplicaciones de computación de flujos y agregación de datos que necesitan procesar por lotes o agregar mensajes de la misma fuente. Por ejemplo, un consumidor podría recopilar métricas de una sola cola durante una ventana de tiempo y calcular promedios continuos.
Alcance
El balanceo de carga basado en colas es la única política disponible para consumidores en las versiones 3.x y 4.x del broker, incluidos los tipos Pull Consumer, Push Consumer predeterminado, Pull Consumer predeterminado y Lite Pull Consumer. En la versión 5.x del broker, los tipos Pull Consumer continúan utilizando el balanceo de carga basado en colas de forma predeterminada.
No se requiere configuración adicional; el balanceo de carga basado en colas se habilita automáticamente para estos tipos de consumidores.
Ejemplo
Para ver código de ejemplo, consulte LitePullConsumerAssign.java en la biblioteca de código de Apache RocketMQ.
Compatibilidad de versiones
|
Versión del broker |
Políticas disponibles |
Notas |
|
3.x, 4.x |
Solo basada en colas |
Todos los tipos de consumidores utilizan el balanceo de carga basado en colas. |
|
5.x |
Tanto basada en mensajes como basada en colas |
Push Consumer y Simple Consumer utilizan la basada en mensajes de forma predeterminada. Pull Consumer utiliza la basada en colas de forma predeterminada. |
La política de balanceo de carga basada en mensajes se introdujo en la versión 5.0 del broker. Si ejecuta la versión 5.x del broker, la política activa depende de la versión del cliente y del tipo de consumidor.
Notas de uso
Implementar manejo idempotente de mensajes
Ambas políticas de balanceo de carga desencadenan un rebalanceo temporal cuando se agregan o eliminan consumidores, o cuando el broker escala. Durante el rebalanceo, una pequeña cantidad de mensajes podría entregarse más de una vez. Para manejar esto, implemente deduplicación para garantizar la idempotencia en su lógica de consumo de mensajes.