Todos os produtos
Search
Central de documentação

ApsaraMQ for RocketMQ:Filtragem de mensagens

Última atualização: Jun 27, 2026

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

Message filtering workflow

  1. O produtor anexa uma tag ou atributos personalizados a cada mensagem.

  2. O consumidor registra uma expressão de filtro no broker ao assinar um tópico.

  3. 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, TagA e tagA sã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

"TagA"

Múltiplas tags

Entrega mensagens correspondentes a qualquer tag listada. Separe as tags com duas barras verticais (`

`).

`"TagA

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:

Tag-based filtering example

Sistema

Expressão de filtro

Mensagens recebidas

Sistema de pagamento

"Payment"

Apenas mensagens de pagamento

Sistema de logística

"Logistics"

Apenas mensagens de logística

Análise de transações

`"Order

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

IS NULL

O atributo não existe

a IS NULL

IS NOT NULL

O atributo existe

a IS NOT NULL

>, >=, <, <=

Comparação numérica. Não é possível comparar strings.

a IS NOT NULL AND a > 100

BETWEEN x AND y

Faixa numérica (inclusiva). Equivalente a >= x AND <= y.

a IS NOT NULL AND (a BETWEEN 10 AND 100)

NOT BETWEEN x AND y

Fora da faixa numérica. Equivalente a < x OR > y.

a IS NOT NULL AND (a NOT BETWEEN 10 AND 100)

IN (x, y)

O valor está em um conjunto. Os elementos do conjunto devem ser strings.

a IS NOT NULL AND (a IN ('abc', 'def'))

=, <>

Igual / diferente. Funciona tanto para números quanto para strings.

a IS NOT NULL AND (a = 'abc' OR a <> 'def')

AND, OR

Operadores lógicos. Coloque cada condição entre parênteses.

a IS NOT NULL AND (a > 100) OR (b IS NULL)

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: a > 'abc'

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

Nota

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.

SQL-based filtering example

Sistema

Expressão de filtro

Mensagens recebidas

Sistema de logística 1

"TAGS = 'Logistics' AND Region IS NOT NULL AND Region = 'Hangzhou'"

Apenas mensagens de logística para Hangzhou

Sistema de logística 2

"TAGS = 'Logistics'"

Todas as mensagens de logística

Rastreamento de pedidos

"TAGS = 'Order'"

Apenas mensagens de pedidos

Computação em tempo real

"True"

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 Ordinary ou Urgent.

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):

Accumulated messages formula

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