No ApsaraMQ for RocketMQ, a consistência de assinatura significa que todas as instâncias consumidoras identificadas pelo mesmo group ID devem assinar os mesmos tópicos e tags. Assinaturas inconsistentes podem causar erros na lógica de consumo de mensagens, resultando em consumo duplicado ou perda de mensagens.
O que é consistência de assinatura?
No ApsaraMQ for RocketMQ, um grupo de consumidores é um conjunto de instâncias consumidoras. Na maioria das aplicações distribuídas, várias instâncias consumidoras estão associadas a um único grupo de consumidores.
No ApsaraMQ for RocketMQ, uma assinatura refere-se ao relacionamento entre um grupo de consumidores e um tópico específico, incluindo as condições usadas para filtrar mensagens no tópico assinado.
Para garantir a consistência das assinaturas, todas as instâncias consumidoras identificadas pelo mesmo group ID devem manter a uniformidade nos seguintes aspectos:
-
Os tópicos assinados pelas instâncias consumidoras devem ser idênticos.
Por exemplo, se o Consumidor 1 assinar o Tópico A e o Tópico B, o Consumidor 2 do mesmo grupo também deverá assinar o Tópico A e o Tópico B. O Consumidor 2 não pode assinar apenas o Tópico A ou o Tópico B, nem assinar o Tópico A e o Tópico C.
-
As tags assinadas pelas instâncias consumidoras no tópico devem ser consistentes, incluindo a quantidade e a ordem das tags.
Por exemplo, se o Consumidor 1 assinar Tag1||Tag2 no Tópico B, o Consumidor 2 do mesmo grupo também deverá assinar Tag1||Tag2 no Tópico B. O Consumidor 2 não pode assinar apenas Tag1 ou Tag2, nem assinar Tag2||Tag1 no Tópico B.
-
Se as instâncias consumidoras de um grupo assinarem múltiplos tópicos, o tipo de mensagem desses tópicos deve ser o mesmo.
Por exemplo, se o Consumidor 1 e o Consumidor 2 assinarem o Tópico A e o Tópico B, os tópicos devem ter o mesmo tipo de mensagem, como mensagem normal ou mensagem ordenada. Para obter informações sobre os tipos de mensagem compatíveis com o ApsaraMQ for RocketMQ, consulte Tipos de mensagem.
A figura a seguir mostra um exemplo de assinaturas consistentes. Grupos com IDs diferentes assinam tópicos distintos. Cada grupo contém as instâncias consumidoras C1, C2 e C3. Todas as instâncias consumidoras do mesmo grupo assinam os mesmos tópicos e tags.
O ApsaraMQ for RocketMQ permite o uso dos SDKs cliente TCP e HTTP para enviar e receber mensagens. Além de garantir a consistência das assinaturas das instâncias consumidoras no mesmo grupo, assegure a compatibilidade entre a versão do protocolo do grupo de consumidores que assina as mensagens e a versão do protocolo do SDK. Por exemplo, ao utilizar um SDK cliente TCP para envio e recebimento de mensagens, use obrigatoriamente um grupo de consumidores baseado no protocolo TCP para assinar. Caso contrário, o consumo das mensagens falhará.
Como verificar a consistência das assinaturas das instâncias consumidoras em um grupo?
Para validar se as assinaturas das instâncias consumidoras de um grupo estão consistentes, execute os passos abaixo:
Faça login no console do ApsaraMQ for RocketMQ. Na página Instances, localize a instância desejada e clique em seu nome para acessar a página Instance Details.
No painel de navegação à esquerda, clique em Groups. Na página exibida, selecione o nome do grupo de consumidores que deseja gerenciar.
Na seção Subscriptions da página Group Details, verifique se as assinaturas do grupo de consumidores apresentam consistência.
Assinatura consistente 1: Uma tag em um tópico
Na figura abaixo, as instâncias consumidoras C1, C2 e C3 pertencem ao mesmo grupo. Essas instâncias assinam a Tag 1 no Tópico A. Este cenário atende aos requisitos de consistência de assinatura.
**
Código de exemplo da assinatura consistente 1**
Como as assinaturas de C1, C2 e C3 são consistentes, o código implementado para que essas instâncias consumam mensagens deve ser idêntico. Código de exemplo:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_1");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicA", "Tag1", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
Assinatura consistente 2: Múltiplas tags em um tópico
Na ilustração a seguir, as instâncias consumidoras C1, C2 e C3 fazem parte do mesmo grupo. Elas assinam Tag1||Tag2 no Tópico B. Dessa forma, todas as instâncias consomem as mensagens com Tag 1 ou Tag 2 no Tópico B seguindo a mesma ordem. Essa configuração cumpre os critérios de consistência de assinatura.
**
Código de exemplo da assinatura consistente 2**
Visto que as assinaturas de C1, C2 e C3 são uniformes, a implementação do código para assinatura de mensagens nessas instâncias precisa ser igual. Veja o exemplo:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_2");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicB", "Tag1||Tag2", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
Assinatura consistente 3: Múltiplas tags em múltiplos tópicos
No diagrama seguinte, as instâncias consumidoras C1, C2 e C3 integram o mesmo grupo. Elas assinam o Tópico A e o Tópico B. Nenhuma tag foi definida para o Tópico A, enquanto Tag1||Tag2 foram especificadas para o Tópico B. Nessa situação, as instâncias recebem todas as mensagens do Tópico A e as mensagens com Tag 1 ou Tag 2 do Tópico B, respeitando a mesma sequência. Tal arranjo satisfaz as regras de consistência de assinatura.
**
Código de exemplo da assinatura consistente 3**
Dado que C1, C2 e C3 possuem assinaturas alinhadas, o código desenvolvido para o consumo de mensagens deve ser replicado exatamente entre elas. Exemplo de implementação:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_3");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicA", "*", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
consumer.subscribe("TopicB", "Tag1||Tag2", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
Assinaturas inconsistentes
Ao utilizar o ApsaraMQ for RocketMQ para troca de mensagens, as instâncias consumidoras podem não receber os dados conforme o esperado, e as assinaturas exibidas no console do ApsaraMQ for RocketMQ aparecem divergentes. Esse comportamento geralmente decorre de um dos problemas listados abaixo nas instâncias consumidoras:
Inconsistência de assinatura 1: Instâncias consumidoras do mesmo grupo assinam tópicos diferentes
Na imagem a seguir, as instâncias consumidoras C1, C2 e C3 compõem o mesmo grupo, mas assinam tópicos distintos. C1 assina o Tópico A, C2 assina o Tópico B e C3 assina o Tópico C. Essa configuração viola os princípios de consistência de assinatura.
Inconsistência de assinatura 2: Instâncias consumidoras do mesmo grupo assinam tags diferentes no mesmo tópico
Conforme a figura abaixo, as instâncias consumidoras C1, C2 e C3 pertencem ao mesmo grupo e assinam o Tópico A. Contudo, C1 consome a Tag 1 do Tópico A, enquanto C2 e C3 consomem a Tag 2 do mesmo tópico. Como as instâncias utilizam tags distintas dentro do mesmo tópico, essa situação caracteriza uma inconsistência de assinatura.

Inconsistência de assinatura 3: Instâncias consumidoras do mesmo grupo assinam o mesmo tópico e as mesmas tags, mas em ordens diferentes
Na representação visual a seguir, as instâncias consumidoras C1, C2 e C3 formam o mesmo grupo e assinam o Tópico A e o Tópico B. Não há filtros de tag para o Tópico A. Já para o Tópico B, definiram-se a Tag 1 e a Tag 2. Entretanto, C1 utiliza a expressão Tag1||Tag2 no Tópico B, ao passo que C2 e C3 empregam Tag2||Tag1 no mesmo tópico. Essa divergência na ordenação torna a assinatura inconsistente.

Perguntas frequentes
Um grupo de consumidores pode assinar vários tópicos?
Sim, um grupo de consumidores pode assinar múltiplos tópicos. Quando um grupo estabelece uma assinatura para um tópico específico, certifique-se de que todas as instâncias consumidoras pertencentes a esse grupo também assinem o mesmo tópico.
É possível excluir uma assinatura diretamente no console do ApsaraMQ for RocketMQ?
Não, o console do ApsaraMQ for RocketMQ não oferece funcionalidade para remoção direta de assinaturas. Para cancelar uma assinatura, ajuste o parâmetro correspondente no código do cliente.
