Quando vários consumidores em um grupo de consumidores buscam mensagens de um tópico, o ApsaraMQ for RocketMQ distribui essas mensagens entre os consumidores usando uma política de balanceamento de carga. Isso melhora o throughput e simplifica o dimensionamento horizontal.
Escolha uma política de balanceamento de carga
O ApsaraMQ for RocketMQ oferece duas políticas de balanceamento de carga. A política aplicável depende do tipo de consumidor e da versão do broker.
|
Política |
Padrão para |
Granularidade |
Mais indicada para |
|
Baseada em mensagens |
Push Consumer, Simple Consumer (broker 5.x) |
Mensagens individuais |
Cargas de trabalho orientadas a eventos em que cada mensagem é processada independentemente |
|
Baseada em filas |
Pull Consumer (broker 3.x/4.x/5.x) |
Filas inteiras |
Cargas de trabalho de processamento de fluxo e agregação em lote |
Dica: Se seus consumidores processam mensagens uma por vez, o balanceamento de carga baseado em mensagens proporciona uma distribuição mais uniforme e operações mais simples. Caso seus consumidores agreguem ou processem mensagens em lote a partir de uma única source, utilize o balanceamento de carga baseado em filas.
Contexto
Compreender essas políticas ajuda no planejamento de:
Recuperação de desastres -- como as mensagens são reenviadas e como o failover funciona quando nós locais falham.
Ordenação de mensagens -- como o ApsaraMQ for RocketMQ mantém a ordem estrita FIFO (first-in-first-out) dentro de um grupo de mensagens.
Dimensionamento horizontal -- como planejar a migração de tráfego e o dimensionamento horizontal ao adicionar ou remover consumidores.
Consumo broadcast versus consumo cluster
O ApsaraMQ for RocketMQ suporta dois modos de consumo. O balanceamento de carga aplica-se apenas ao consumo cluster.
|
Modo |
Consumidores por grupo |
Entrega de mensagens |
Caso de uso |
Balanceamento de carga |
|
Broadcast |
Um por grupo |
Cada grupo recebe todas as mensagens |
Envio via gateway, envio de configurações |
Não aplicável |
|
Cluster |
Vários por grupo |
Cada mensagem vai para um consumidor |
Desacoplamento de microsserviços, dimensionamento horizontal |
Baseado em mensagens ou baseado em filas |

Consumo broadcast (lado esquerdo do diagrama): Cada grupo de consumidores tem um consumidor que recebe todas as mensagens. Grupos de consumidores diferentes recebem o fluxo completo de mensagens de forma independente.
Consumo cluster (lado direito do diagrama): Um grupo de consumidores tem vários consumidores, e as mensagens são distribuídas entre eles. Apenas um consumidor no grupo processa cada mensagem.
Balanceamento de carga baseado em mensagens
Como funciona
O broker distribui mensagens individuais de um tópico uniformemente entre todos os consumidores de um grupo, independentemente da fila à qual as mensagens pertencem. Vários consumidores podem processar mensagens da mesma fila simultaneamente.

Neste exemplo, o Grupo de Consumidores A tem três consumidores: A1, A2 e A3. Todos consomem mensagens da Queue1. O broker atribui cada mensagem a um consumidor por vez.
Quando um consumidor recebe uma mensagem, o broker bloqueia essa mensagem para torná-la invisível aos outros consumidores. A mensagem permanece bloqueada até que o consumidor confirme seu recebimento ou o tempo limite do bloqueio expire. Isso evita o processamento duplicado em condições normais.
As mensagens são distribuídas sob demanda, não pré-atribuídas. Não é possível controlar qual consumidor específico receberá uma determinada mensagem.
Tratamento de mensagens ordenadas
Para mensagens ordenadas, o ApsaraMQ for RocketMQ garante que as mensagens dentro do mesmo grupo sejam processadas na ordem exata em que foram armazenadas no broker.

Considere quatro mensagens ordenadas (M1 a M4) no grupo de mensagens G1 da Queue1. Se o consumidor A1 estiver processando M1 e M2, o consumidor A2 não poderá iniciar o processamento de M3 ou M4 até que A1 envie o status de consumo de M1 e M2. O broker impõe um bloqueio sequencial rigoroso para manter a ordem.
Vantagens sobre o balanceamento de carga baseado em filas
|
Vantagem |
Como funciona |
Por que é importante |
|
Distribuição uniforme |
As mensagens são alocadas sob demanda, mantendo todos os consumidores ocupados. |
No balanceamento baseado em filas, a incompatibilidade entre o número de filas e de consumidores pode deixar alguns consumidores ociosos. |
|
Tolerância a capacidades desiguais |
Consumidores mais lentos recebem menos mensagens automaticamente. |
No balanceamento baseado em filas, diferenças nas condições de rede ou nas especificações de hardware podem fazer com que um consumidor lento, atribuído a uma fila movimentada, acumule pendências enquanto outros ficam ociosos. |
|
Planejamento de capacidade simplificado |
Não há necessidade de igualar o número de filas ao número de consumidores. |
Adicione ou remova consumidores livremente sem ajustar a quantidade de filas. |
Quando usar
O balanceamento de carga baseado em mensagens é adequado para a maioria das cargas de trabalho de processamento de eventos online, onde cada mensagem é tratada independentemente — por exemplo, processamento de pedidos, envio de notificações e tratamento de eventos em tempo real.
Para cargas de trabalho de processamento de fluxo ou agregação que exigem o agrupamento de mensagens da mesma fila, use o balanceamento de carga baseado em filas.
Escopo
O balanceamento de carga baseado em mensagens é a única política disponível para os tipos Push Consumer e Simple Consumer na versão 5.x do broker. Ele vem ativado por padrão e não requer configuração adicional.
Exemplo
Os tipos Push Consumer e Simple Consumer usam o balanceamento de carga baseado em mensagens automaticamente. Os exemplos Java a seguir mostram ambos os tipos de consumidor processando mensagens sem nenhuma configuração de balanceamento de carga.
Push Consumer com um listener de mensagens:
// 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 com confirmação 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();
}
Balanceamento de carga baseado em filas
Como funciona
O broker atribui cada fila de um tópico a exatamente um consumidor no grupo de consumidores. Cada consumidor processa então todas as mensagens de suas filas atribuídas.

Neste exemplo, um tópico tem três filas (Queue1, Queue2, Queue3) e o grupo de consumidores tem dois consumidores. Como cada fila é atribuída a um consumidor, o consumidor A2 recebe duas filas, enquanto o A1 recebe uma. Se houver menos filas do que consumidores, alguns consumidores não recebem filas e permanecem ociosos.
Cada consumidor segue esta sequência de processamento: busca mensagens da fila atribuída, envia o offset de consumo e persiste o offset. Como o status de consumo não retorna à fila quando um consumidor busca mensagens, cada fila deve ser atribuída exclusivamente a um único consumidor para evitar processamento duplicado.
O balanceamento de carga baseado em filas foi projetado para que cada fila seja processada por um consumidor. No entanto, a implementação depende do mecanismo de negociação de informações entre o consumidor e o broker. O ApsaraMQ for RocketMQ não garante que as mensagens de uma fila sejam processadas por apenas um consumidor. Quando a quantidade de consumidores ou filas muda, podem ocorrer inconsistências temporárias na atribuição de filas, e um pequeno número de mensagens pode ser processado mais de uma vez. Sempre implemente o tratamento idempotente de mensagens.
Vantagens sobre o balanceamento de carga baseado em mensagens
|
Vantagem |
Como funciona |
Por que é importante |
|
Afinidade de fila |
Todas as mensagens de uma fila vão para o mesmo consumidor. |
Permite agregação local e processamento em lote dentro de um único consumidor. |
|
Suporte a processamento de fluxo |
Os consumidores mantêm o processamento com estado sobre um fluxo contínuo da mesma fila. |
Suporta computações baseadas em janelas de tempo e agregações contínuas. |
Quando usar
O balanceamento de carga baseado em filas é ideal para aplicações de computação de fluxo e agregação de dados que precisam processar em lote ou agregar mensagens da mesma source. Por exemplo, um consumidor pode coletar métricas de uma única fila durante uma janela de tempo e calcular médias móveis.
Escopo
O balanceamento de carga baseado em filas é a única política disponível para consumidores nas versões 3.x e 4.x do broker, incluindo os tipos Pull Consumer, Push Consumer padrão, Pull Consumer padrão e Lite Pull Consumer. Na versão 5.x do broker, os tipos Pull Consumer continuam a usar o balanceamento de carga baseado em filas por padrão.
Nenhuma configuração adicional é necessária — o balanceamento de carga baseado em filas vem ativado automaticamente para esses tipos de consumidor.
Exemplo
Para obter códigos de exemplo, acesse LitePullConsumerAssign.java na biblioteca de códigos do Apache RocketMQ.
Compatibilidade de versões
|
Versão do broker |
Políticas disponíveis |
Observações |
|
3.x, 4.x |
Apenas baseada em filas |
Todos os tipos de consumidor usam balanceamento de carga baseado em filas. |
|
5.x |
Baseada em mensagens e baseada em filas |
Push Consumer e Simple Consumer usam o modelo baseado em mensagens por padrão. Pull Consumer usa o modelo baseado em filas por padrão. |
A política de balanceamento de carga baseada em mensagens foi introduzida na versão 5.0 do broker. Se você executar a versão 5.x do broker, a política ativa dependerá da versão do cliente e do tipo de consumidor.
Observações de uso
Implemente o tratamento idempotente de mensagens
Ambas as políticas de balanceamento de carga acionam um rebalanceamento temporário quando consumidores são adicionados, removidos ou quando o broker escala. Durante o rebalanceamento, um pequeno número de mensagens pode ser entregue mais de uma vez. Para lidar com isso, implemente a deduplicação para garantir a idempotência da sua lógica de consumo de mensagens.