Todos os produtos
Search
Central de documentação

ApsaraMQ for RocketMQ:Consistência de assinatura

Última atualização: Jun 27, 2026

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.Relacionamento de assinatura correto

Importante

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:

  1. 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.

  2. No painel de navegação à esquerda, clique em Groups. Na página exibida, selecione o nome do grupo de consumidores que deseja gerenciar.

  3. 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.

**Exemplo correto 1Có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.

**Exemplo correto 2Có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.

**Exemplo correto 3Có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.

Exemplo de erro 1

Código de exemplo da assinatura inconsistente 1

  • Instância consumidora 1:

  •     Properties properties = new Properties();
        properties.put(PropertyKeyConst.GROUP_ID, "GID_test_1");
        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;
            }
        });                    
  • Instância consumidora 2:

  •     Properties properties = new Properties();
        properties.put(PropertyKeyConst.GROUP_ID, "GID_test_1");
        Consumer consumer = ONSFactory.createConsumer(properties);
        consumer.subscribe("TopicC", "*", new MessageListener() {
            public Action consume(Message message, ConsumeContext context) {
                System.out.println(message.getMsgID());
                return Action.CommitMessage;
            }
        });                    
  • Instância consumidora 3:

  •     Properties properties = new Properties();
        properties.put(PropertyKeyConst.GROUP_ID, "GID_test_1");
        Consumer consumer = ONSFactory.createConsumer(properties);
        consumer.subscribe("TopicB", "*", new MessageListener() {
            public Action consume(Message message, ConsumeContext context) {
                System.out.println(message.getMsgID());
                return Action.CommitMessage;
            }
        });                    

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.

Exemplo de erro 2

Código de exemplo da assinatura inconsistente 2

  • Instância consumidora 1:

     Properties properties = new Properties();
     properties.put(PropertyKeyConst.GROUP_ID, "GID_test_2");
     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;
     }
     }); 
  • Instância consumidora 2:

     Properties properties = new Properties();
     properties.put(PropertyKeyConst.GROUP_ID, "GID_test_2");
     Consumer consumer = ONSFactory.createConsumer(properties);
     consumer.subscribe("TopicA", "Tag2", new MessageListener() {
     public Action consume(Message message, ConsumeContext context) {
     System.out.println(message.getMsgID());
     return Action.CommitMessage;
     }
     }); 
  • Instância consumidora 3:

     Properties properties = new Properties();
     properties.put(PropertyKeyConst.GROUP_ID, "GID_test_2");
     Consumer consumer = ONSFactory.createConsumer(properties);
     consumer.subscribe("TopicA", "Tag2", new MessageListener() {
     public Action consume(Message message, ConsumeContext context) {
     System.out.println(message.getMsgID());
     return Action.CommitMessage;
     }
     }); 

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.

Exemplo de erro 3

Código de exemplo da assinatura inconsistente 3

  • Instância consumidora 1:

     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;
     }
     }); 
  • Instância consumidora 2:

     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", "Tag2||Tag1", new MessageListener() {
     public Action consume(Message message, ConsumeContext context) {
     System.out.println(message.getMsgID());
     return Action.CommitMessage;
     }
     }); 
  • Instância consumidora 3:

     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", "Tag2||Tag1", new MessageListener() {
     public Action consume(Message message, ConsumeContext context) {
     System.out.println(message.getMsgID());
     return Action.CommitMessage;
     }
     }); 

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.