O ApsaraMQ for RocketMQ distribui mensagens entre várias filas para evitar pontos de acesso e gargalos de desempenho. O tipo de mensagem determina qual política de balanceamento de carga se aplica: mensagens não ordenadas usam round robin e mensagens ordenadas usam MessageGroupHash.
Compreender essas políticas ajuda você a:
Planejar a recuperação de desastres: Saiba como as mensagens são redirecionadas quando um nó falha.
Garantir a ordenação de mensagens: Entenda como o ApsaraMQ for RocketMQ mantém a entrega estrita em FIFO para mensagens ordenadas.
Dimensionar o throughput: Projete estratégias eficazes de distribuição de tráfego e dimensionamento de filas.
Comparação de políticas
| Política | Tipo de mensagem | Algoritmo | Garantia de ordenação | Suporte de versão |
|---|---|---|---|---|
| Round robin | Não ordenada (normal, programada, transacional) | Distribuição cíclica entre todas as filas | Nenhuma | 5.x, 4.x, 3.x |
| MessageGroupHash | Ordenada | Hash baseado em SipHash no grupo de mensagens | FIFO dentro do mesmo grupo de mensagens | Somente 5.x |
Round robin
O round robin é a política padrão e exclusiva de balanceamento de carga para mensagens não ordenadas, incluindo mensagens normais, programadas e transacionais.
Como funciona
O produtor percorre todas as filas em um tópico, distribuindo uma mensagem por fila antes de passar para a próxima. Esse processo mantém a carga distribuída uniformemente entre as filas e maximiza o throughput do tópico.

Neste diagrama, Queue 1, Queue 2 e Queue 3 são filas do tópico. O produtor envia M1 para Queue 1, M2 para Queue 2 e M3 para Queue 3 e, em seguida, reinicia o ciclo para as próximas mensagens.
Isolamento de falhas
Se o envio de uma mensagem falhar, o ApsaraMQ for RocketMQ avalia a causa da falha e pode ignorar temporariamente o nó afetado ao selecionar a próxima fila de destino. Esse isolamento automático de falhas redireciona as mensagens subsequentes para filas íntegras sem intervenção manual.
Exemplo de código
O round robin está ativado por padrão para mensagens não ordenadas. Nenhuma configuração adicional é necessária.
// Round robin is the default policy for normal messages.
// The SDK automatically distributes messages across all queues.
MessageBuilder messageBuilder = null;
for (int i = 0; i < 10; i++) {
Message message = messageBuilder.setTopic("normalTopic")
// Set the message index key for accurate message lookup.
.setKeys("messageKey")
// Set the message tag for consumer-side filtering.
.setTag("messageTag")
// Set the message body.
.setBody("messageBody".getBytes())
.build();
try {
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}MessageGroupHash
O MessageGroupHash é a política padrão e exclusiva de balanceamento de carga para mensagens ordenadas. Ele garante a entrega em FIFO (first-in, first-out) dentro de cada grupo de mensagens.
Como funciona
O produtor aplica hash ao identificador de grupo de cada mensagem usando o algoritmo SipHash e mapeia o resultado para uma fila específica. Todas as mensagens do mesmo grupo de mensagens são roteadas para a mesma fila e armazenadas na ordem de envio.

Neste diagrama, G1-M1, G1-M2 e G1-M3 pertencem ao MessageGroup 1. O algoritmo SipHash os mapeia para MessageQueue 1, onde são armazenados na ordem de envio.
Risco de distribuição desigual
Como o MessageGroupHash mapeia cada grupo para uma fila fixa, volumes desiguais de mensagens entre grupos podem concentrar a carga em um pequeno número de filas. Se a maioria das mensagens pertence a poucos grupos, essas filas se tornam pontos de acesso, aumentando a pressão de armazenamento e limitando a capacidade de dimensionamento.
Para mitigar esse problema, projete grupos de mensagens em um nível granular. Por exemplo, em um sistema de comércio eletrônico, use IDs de pedido ou IDs de usuário como chaves de grupo de mensagens. Isso distribui as mensagens entre muitos grupos, preservando a ordenação por pedido ou por usuário.
Exemplo de código
O MessageGroupHash está ativado por padrão para mensagens ordenadas. Especifique o grupo de mensagens com setMessageGroup().
// MessageGroupHash is the default policy for ordered messages.
// Messages in the same group go to the same queue, in send order.
for (int i = 0; i < 10; i++) {
Message message = messageBuilder.setTopic("fifoTopic")
// Set the message index key for accurate message lookup.
.setKeys("messageKey")
// Set the message tag for consumer-side filtering.
.setTag("messageTag")
// Set the message group. Messages with the same group
// are routed to the same queue via the SipHash algorithm.
.setMessageGroup("fifoGroupA")
// Set the message body.
.setBody("messageBody".getBytes())
.build();
try {
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}Compatibilidade de versões
| Política | 5.x | 4.x | 3.x |
|---|---|---|---|
| Round robin | Compatível | Compatível | Compatível |
| MessageGroupHash | Compatível | Não compatível | Não compatível |
Ao atualizar da versão 4.x ou 3.x para 5.x do servidor, o mecanismo de entrega de mensagens ordenadas muda da abordagem legada para o MessageGroupHash. Para evitar a reordenação de mensagens durante a transição, consuma todas as mensagens existentes no tópico antes de mudar para a versão 5.x.
O round robin é compatível com todas as versões de servidor e não requer etapas de migração.
Práticas recomendadas
Distribuir mensagens entre vários grupos
No modo MessageGroupHash, todas as mensagens do mesmo grupo vão para a mesma fila. Se a lógica de negócios concentrar mensagens em poucos grupos, essas filas ficarão sobrecarregadas.
Escolha chaves de grupo granulares que distribuam as mensagens de forma uniforme. Por exemplo:
| Cenário | Chave de grupo recomendada | Benefício |
|---|---|---|
| Processamento de pedidos | ID do pedido | Uma fila por pedido; os pedidos são distribuídos entre as filas |
| Rastreamento de atividade do usuário | ID do usuário | Ordenação por usuário com distribuição uniforme entre usuários |
| Telemetria de dispositivos | ID do dispositivo | Ordenação por dispositivo sem pontos de acesso |
Usar mais de uma fila por tópico
Independentemente da política de balanceamento de carga, um tópico com uma única fila não consegue distribuir a carga. Todas as mensagens vão para essa fila, criando um gargalo de desempenho e eliminando a capacidade de recuperação de desastres.
Configure sempre várias filas por tópico para possibilitar a distribuição de carga e o failover.