Por padrão, o ApsaraMQ for RocketMQ entrega todas as mensagens de um tópico a todos os assinantes. Para receber apenas um subconjunto, atribua uma expressão de filtro à assinatura do consumidor. O broker avalia a expressão no servidor e entrega somente as mensagens correspondentes, reduzindo o tráfego de rede e a sobrecarga de processamento do consumidor.
Use a filtragem de mensagens para categorização granular dentro de um único domínio de negócios. Para domínios distintos, utilize tópicos diferentes.
Como funciona

O produtor anexa uma tag ou atributos personalizados a cada mensagem.
O consumidor registra uma expressão de filtro no broker ao assinar um tópico.
O broker avalia cada mensagem recebida com base na expressão de filtro e entrega apenas as correspondências.
Escolha um método de filtragem
O ApsaraMQ for RocketMQ oferece dois métodos de filtragem: baseada em tags e SQL baseada em atributos.
|
Filtragem baseada em tags |
Filtragem SQL baseada em atributos |
|
|
Alvo do filtro |
Tags da mensagem |
Atributos da mensagem (personalizados e de sistema). As tags são um atributo de sistema. |
|
Tipo de correspondência |
Correspondência exata de string |
Correspondência de expressão SQL-92 |
|
Mais indicado para |
Roteamento simples com poucas categorias |
Lógica de filtragem complexa envolvendo múltiplos atributos |
Como as tags são atributos de sistema, a filtragem baseada em tags é um subconjunto da filtragem SQL. Nas expressões SQL, referencie a tag de uma mensagem pela palavra-chave TAGS.
Filtragem baseada em tags
A filtragem baseada em tags executa correspondência exata de strings na tag anexada a cada mensagem.
Regras de tags
Cada mensagem pode ter apenas uma tag.
A tag é uma string sensível a maiúsculas e minúsculas. Por exemplo,
TagAetagAsão tags diferentes.Mantenha as tags com menos de 128 caracteres.
Sintaxe da expressão de filtro
|
Expressão |
Comportamento |
Exemplo |
||||||
|
Tag única |
Entrega mensagens com essa tag exata |
|
||||||
|
Múltiplas tags |
Entrega mensagens correspondentes a qualquer tag listada. Separe as tags com duas barras verticais ( |
`). |
|
TagB |
TagC"` |
|||
|
Wildcard |
Entrega todas as mensagens do tópico |
|
Caso de uso: roteamento de transações de e-commerce
Uma plataforma de e-commerce envia mensagens de pedidos, pagamentos e logística para um único tópico Trade_Topic. Diferentes sistemas downstream assinam com filtros de tags distintos:

|
Sistema |
Expressão de filtro |
Mensagens recebidas |
||
|
Sistema de pagamento |
|
Apenas mensagens de pagamento |
||
|
Sistema de logística |
|
Apenas mensagens de logística |
||
|
Análise de transações |
|
Payment"` |
Mensagens de pedidos e pagamentos |
|
|
Computação em tempo real |
|
Todas as mensagens |
Código de exemplo
Defina uma tag no lado do produtor:
Message message = messageBuilder.setTopic("topic")
.setKeys("messageKey")
.setTag("TagA")
.setBody("messageBody".getBytes())
.build();
Assine mensagens com uma única tag:
String topic = "Your Topic";
FilterExpression filterExpression = new FilterExpression("TagA", FilterExpressionType.TAG);
pushConsumer.subscribe(topic, filterExpression);
Assine mensagens correspondentes a qualquer uma das múltiplas tags:
String topic = "Your Topic";
FilterExpression filterExpression = new FilterExpression("TagA||TagB||TagC", FilterExpressionType.TAG);
pushConsumer.subscribe(topic, filterExpression);
Assine todas as mensagens do tópico:
String topic = "Your Topic";
FilterExpression filterExpression = new FilterExpression("*", FilterExpressionType.TAG);
pushConsumer.subscribe(topic, filterExpression);
Filtragem SQL baseada em atributos
A filtragem SQL baseada em atributos avalia expressões SQL-92 nos atributos da mensagem. Os produtores anexam atributos personalizados de chave-valor a cada mensagem e os consumidores escrevem expressões SQL para selecionar as mensagens necessárias.
Regras de atributos
Cada mensagem pode ter vários atributos personalizados. Cada atributo é um par chave-valor.
As chaves de atributo devem começar com uma letra ou sublinhado (
_) e conter apenas letras, dígitos e sublinhados.
Referência de sintaxe SQL-92
Escreva expressões de filtro usando os seguintes operadores SQL-92:
|
Operador |
Descrição |
Exemplo |
|
|
O atributo não existe |
|
|
|
O atributo existe |
|
|
|
Comparação numérica. Não é possível comparar strings. |
|
|
|
Faixa numérica (inclusiva). Equivalente a |
|
|
|
Fora da faixa numérica. Equivalente a |
|
|
|
O valor está em um conjunto. Os elementos do conjunto devem ser strings. |
|
|
|
Igual / diferente. Funciona tanto para números quanto para strings. |
|
|
|
Operadores lógicos. Coloque cada condição entre parênteses. |
|
Restrições de valores numéricos:
Os valores numéricos são inteiros de 32 bits, variando de -2.147.483.648 a 2.147.483.647.
Strings conversíveis em números são tratadas como valores numéricos.
Como o broker lida com casos extremos
Se não for possível avaliar uma expressão de filtro corretamente, o broker descarta a mensagem em vez de entregá-la. Isso se aplica a três situações:
|
Situação |
Exemplo |
Comportamento do broker |
|
Exceção de avaliação |
Comparação de um valor numérico com uma string não numérica: |
Mensagem filtrada |
|
Resultado nulo ou não booleano |
O consumidor filtra por um atributo que o produtor não definiu |
Mensagem filtrada |
|
Incompatibilidade de tipo |
O produtor define um valor de atributo de ponto flutuante, mas a expressão de filtro usa comparação de inteiros |
Mensagem filtrada |
O broker descarta silenciosamente as mensagens que acionam esses casos extremos. Para evitar perda inesperada de mensagens, garanta que os produtores definam consistentemente todos os atributos referenciados pelos consumidores nas expressões de filtro e que os tipos de atributo correspondam aos operadores de comparação utilizados.
Caso de uso: filtragem de mensagens de logística por região
Uma plataforma de e-commerce envia mensagens de pedidos e logística para Trade_Topic. As mensagens de logística carregam um atributo Region com valores como Hangzhou ou Shanghai.

|
Sistema |
Expressão de filtro |
Mensagens recebidas |
|
Sistema de logística 1 |
|
Apenas mensagens de logística para Hangzhou |
|
Sistema de logística 2 |
|
Todas as mensagens de logística |
|
Rastreamento de pedidos |
|
Apenas mensagens de pedidos |
|
Computação em tempo real |
|
Todas as mensagens |
Código de exemplo
Defina uma tag e atributos personalizados no lado do produtor:
Message message = messageBuilder.setTopic("topic")
.setKeys("messageKey")
.setTag("messageTag")
// Custom attribute: region
.addProperty("Region", "Hangzhou")
.setBody("messageBody".getBytes())
.build();
Assine mensagens correspondentes a um único atributo:
String topic = "topic";
FilterExpression filterExpression = new FilterExpression(
"Region IS NOT NULL AND Region='Hangzhou'", FilterExpressionType.SQL92);
simpleConsumer.subscribe(topic, filterExpression);
Assine mensagens correspondentes a múltiplos atributos:
String topic = "topic";
FilterExpression filterExpression = new FilterExpression(
"Region IS NOT NULL AND price IS NOT NULL AND Region = 'Hangzhou' AND price > 30",
FilterExpressionType.SQL92);
simpleConsumer.subscribe(topic, filterExpression);
Assine todas as mensagens do tópico:
String topic = "topic";
FilterExpression filterExpression = new FilterExpression("True", FilterExpressionType.SQL92);
simpleConsumer.subscribe(topic, filterExpression);
Consistência de assinatura
Todos os consumidores no mesmo grupo de consumidores devem usar expressões de filtro idênticas para um determinado tópico. Expressões divergentes causam inconsistência de assinatura, resultando em perda de mensagens.
Para mais detalhes, consulte Assinaturas.
Projete tópicos e tags
|
Dimensão |
Diretriz |
|
Tipo de mensagem |
Direcione diferentes tipos de mensagem (mensagens ordenadas, mensagens normais) para tópicos separados. Não use tags para separar tipos de mensagem. |
|
Domínio de negócios |
Utilize tópicos distintos para domínios de negócios diferentes. Por exemplo, use um tópico para mensagens de pagamento e outro para mensagens de logística. |
|
Volume e prioridade |
Isole mensagens de alto volume ou alta prioridade em tópicos próprios para evitar contenção. |
|
Dentro de um domínio |
Use tags para subdividir mensagens dentro do mesmo domínio de negócios. Por exemplo, classifique mensagens de logística como |
Cálculos de mensagens acumuladas
Quando a filtragem está ativa, nem todas as mensagens de um tópico são entregues. Isso afeta a contagem de mensagens acumuladas (backlog):
Filtragem SQL: Mensagens acumuladas = Mensagens prontas + Mensagens em trânsito - Mensagens que não correspondem ao filtro
Filtragem baseada em tags: Mensagens acumuladas = (Mensagens prontas + Mensagens em trânsito) x Taxa de correspondência de tags
Taxa de correspondência de tags = Mensagens correspondentes à tag na amostra / Total de mensagens amostradas.
Perguntas frequentes
Por que consumidores no mesmo grupo perdem mensagens ao assinar tags diferentes?
Todos os consumidores em um grupo de consumidores devem usar a mesma expressão de filtro. Se o consumidor A assinar TagA enquanto o consumidor B assinar TagB, ocorrerá inconsistência de assinatura e haverá perda de mensagens. Alinhe as expressões de filtro em todos os consumidores do grupo ou divida-os em grupos de consumidores separados.
Como a contagem de mensagens consumidas é calculada quando a filtragem está ativa?
Apenas as mensagens que passam pela expressão de filtro contam para o consumo. As mensagens filtradas são excluídas da contagem.
Por que as mensagens se acumulam mesmo quando os consumidores mostram consumo zero?
As mensagens que não correspondem ao filtro ativo ainda existem no tópico e contam para o backlog. Esse comportamento é esperado. Consulte Cálculos de mensagens acumuladas para obter as fórmulas exatas.
Próximos passos
Para exemplos completos de código SDK cobrindo filtragem de mensagens, consulte Visão geral da referência do SDK.