Tous les produits
Search
Centre de documentation

ApsaraMQ for RocketMQ:Message filtering

Dernière mise à jour :Aug 09, 2026

Par défaut, ApsaraMQ for RocketMQ livre tous les messages d'un topic à tous les abonnés. Pour ne recevoir qu'un sous-ensemble, attribuez une expression de filtre à l'abonnement du consommateur. Le broker évalue l'expression côté serveur et ne livre que les messages correspondants, ce qui réduit le trafic réseau et la charge de traitement des consommateurs.

Utilisez le filtrage des messages pour une catégorisation fine au sein d'un même domaine métier. Pour des domaines métiers distincts, utilisez des topics différents.

Fonctionnement

Message filtering workflow

  1. Le producteur joint un tag ou des attributs personnalisés à chaque message.

  2. Le consommateur enregistre une expression de filtre auprès du broker lors de l'abonnement à un topic.

  3. Le broker évalue chaque message entrant par rapport à l'expression de filtre et ne livre que les correspondances.

Choisir une méthode de filtrage

ApsaraMQ for RocketMQ propose deux méthodes de filtrage : le filtrage basé sur les tags et le filtrage SQL basé sur les attributs.

Filtrage basé sur les tags Filtrage SQL basé sur les attributs
Cible du filtre Tags des messages Attributs des messages (attributs personnalisés et système). Les tags constituent un attribut système.
Type de correspondance Correspondance exacte de chaîne Correspondance d'expression SQL-92
Idéal pour Routage simple avec un nombre limité de catégories Logique de filtrage complexe portant sur plusieurs attributs

Les tags étant un attribut système, le filtrage basé sur les tags est un sous-ensemble du filtrage SQL. Dans les expressions SQL, référencez le tag d'un message via le mot-clé TAGS.

Filtrage basé sur les tags

Le filtrage basé sur les tags effectue une correspondance exacte de chaîne sur le tag joint à chaque message.

Règles relatives aux tags

  • Chaque message ne peut avoir qu'un seul tag.

  • Un tag est une chaîne sensible à la casse. Par exemple, TagA et tagA sont des tags différents.

  • Limitez la longueur des tags à moins de 128 caractères.

Syntaxe de l'expression de filtre

Expression Comportement Exemple
Tag unique Livre les messages portant exactement ce tag "TagA"
Plusieurs tags Livre les messages correspondant à n'importe quel tag répertorié. Séparez les tags par deux barres verticales (||). "TagA||TagB||TagC"
Caractère générique Livre tous les messages du topic "*"

Cas d'utilisation : routage des transactions e-commerce

Une plateforme e-commerce envoie des messages de commande, de paiement et de logistique vers un seul topic Trade_Topic. Différents systèmes en aval s'abonnent avec des filtres de tags différents :

Tag-based filtering example

Système Expression de filtre Messages reçus
Système de paiement "Payment" Uniquement les messages de paiement
Système logistique "Logistics" Uniquement les messages logistiques
Analyse des transactions "Order||Payment" Messages de commande et de paiement
Calcul en temps réel "*" Tous les messages

Exemple de code

Définissez un tag côté producteur :

Message message = messageBuilder.setTopic("topic")
                .setKeys("messageKey")
                .setTag("TagA")
                .setBody("messageBody".getBytes())
                .build();

Abonnez-vous aux messages avec un seul tag :

String topic = "Your Topic";
FilterExpression filterExpression = new FilterExpression("TagA", FilterExpressionType.TAG);
pushConsumer.subscribe(topic, filterExpression);

Abonnez-vous aux messages correspondant à plusieurs tags :

String topic = "Your Topic";
FilterExpression filterExpression = new FilterExpression("TagA||TagB||TagC", FilterExpressionType.TAG);
pushConsumer.subscribe(topic, filterExpression);

Abonnez-vous à tous les messages du topic :

String topic = "Your Topic";
FilterExpression filterExpression = new FilterExpression("*", FilterExpressionType.TAG);
pushConsumer.subscribe(topic, filterExpression);

Filtrage SQL basé sur les attributs

Le filtrage SQL basé sur les attributs évalue des expressions SQL-92 par rapport aux attributs des messages. Les producteurs joignent des attributs clé-valeur personnalisés à chaque message, et les consommateurs rédigent des expressions SQL pour sélectionner les messages dont ils ont besoin.

Règles relatives aux attributs

  • Chaque message peut comporter plusieurs attributs personnalisés. Chaque attribut est une paire clé-valeur.

  • Les clés d'attribut doivent commencer par une lettre ou un trait de soulignement (_) et ne peuvent contenir que des lettres, des chiffres et des traits de soulignement.

Référence de la syntaxe SQL-92

Rédigez les expressions de filtre à l'aide des opérateurs SQL-92 suivants :

Opérateur Description Exemple
IS NULL L'attribut n'existe pas a IS NULL
IS NOT NULL L'attribut existe a IS NOT NULL
>, >=, <, <= Comparaison numérique. Impossible de comparer des chaînes. a IS NOT NULL AND a > 100
BETWEEN x AND y Plage numérique (inclusive). Équivalent à >= x AND <= y. a IS NOT NULL AND (a BETWEEN 10 AND 100)
NOT BETWEEN x AND y En dehors de la plage numérique. Équivalent à < x OR > y. a IS NOT NULL AND (a NOT BETWEEN 10 AND 100)
IN (x, y) La valeur appartient à un ensemble. Les éléments de l'ensemble doivent être des chaînes. a IS NOT NULL AND (a IN ('abc', 'def'))
=, <> Égal / différent. Fonctionne pour les nombres et les chaînes. a IS NOT NULL AND (a = 'abc' OR a <> 'def')
AND, OR Opérateurs logiques. Placez chaque condition entre parenthèses. a IS NOT NULL AND (a > 100) OR (b IS NULL)

Contraintes sur les valeurs numériques :

  • Les valeurs numériques sont des entiers 32 bits, allant de -2 147 483 648 à 2 147 483 647.

  • Les chaînes convertibles en nombres sont traitées comme des valeurs numériques.

Gestion des cas limites par le broker

Si une expression de filtre ne peut pas être évaluée correctement, le broker supprime le message au lieu de le livrer. Cela s'applique à trois situations :

Situation Exemple Comportement du broker
Exception d'évaluation Comparaison d'une valeur numérique avec une chaîne non numérique : a > 'abc' Message filtré
Résultat nul ou non booléen Le consommateur filtre sur un attribut que le producteur n'a pas défini Message filtré
Incompatibilité de type Le producteur définit une valeur d'attribut à virgule flottante, mais l'expression de filtre utilise une comparaison entière Message filtré
Remarque

Le broker supprime silencieusement les messages déclenchant ces cas limites. Pour éviter toute perte inattendue de messages, assurez-vous que les producteurs définissent systématiquement tous les attributs référencés par les consommateurs dans les expressions de filtre et que les types d'attributs correspondent aux opérateurs de comparaison utilisés.

Cas d'utilisation : filtrage des messages logistiques par région

Une plateforme e-commerce envoie des messages de commande et logistiques vers Trade_Topic. Les messages logistiques contiennent un attribut Region avec des valeurs telles que Hangzhou ou Shanghai.

SQL-based filtering example

Système Expression de filtre Messages reçus
Système logistique 1 "TAGS = 'Logistics' AND Region IS NOT NULL AND Region = 'Hangzhou'" Uniquement les messages logistiques pour Hangzhou
Système logistique 2 "TAGS = 'Logistics'" Tous les messages logistiques
Suivi des commandes "TAGS = 'Order'" Uniquement les messages de commande
Calcul en temps réel "True" Tous les messages

Exemple de code

Définissez un tag et des attributs personnalisés côté producteur :

Message message = messageBuilder.setTopic("topic")
                .setKeys("messageKey")
                .setTag("messageTag")
                // Custom attribute: region
                .addProperty("Region", "Hangzhou")
                .setBody("messageBody".getBytes())
                .build();

Abonnez-vous aux messages correspondant à un seul attribut :

String topic = "topic";
FilterExpression filterExpression = new FilterExpression(
    "Region IS NOT NULL AND Region='Hangzhou'", FilterExpressionType.SQL92);
simpleConsumer.subscribe(topic, filterExpression);

Abonnez-vous aux messages correspondant à plusieurs attributs :

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

Abonnez-vous à tous les messages du topic :

String topic = "topic";
FilterExpression filterExpression = new FilterExpression("True", FilterExpressionType.SQL92);
simpleConsumer.subscribe(topic, filterExpression);

Cohérence de l'abonnement

Tous les consommateurs d'un même groupe de consommateurs doivent utiliser des expressions de filtre identiques pour un topic donné. Des expressions incompatibles provoquent une incohérence d'abonnement, entraînant la perte de messages.

Pour plus de détails, consultez la rubrique Abonnements.

Conception des topics et des tags

Dimension Recommandation
Type de message Acheminez les différents types de messages (messages ordonnés, messages normaux) vers des topics distincts. N'utilisez pas de tags pour séparer les types de messages.
Domaine métier Utilisez des topics distincts pour différents domaines métiers. Par exemple, utilisez un topic pour les messages de paiement et un autre pour les messages logistiques.
Volume et priorité Isolez les messages à fort volume ou à haute priorité dans leurs propres topics afin d'éviter toute contention.
Au sein d'un domaine Utilisez des tags pour subdiviser les messages au sein d'un même domaine métier. Par exemple, taguez les messages logistiques comme Ordinary ou Urgent.

Calcul des messages accumulés

Lorsque le filtrage est actif, tous les messages d'un topic ne sont pas livrés. Cela affecte le décompte des messages accumulés (backlog) :

Accumulated messages formula

  • Filtrage SQL : Messages accumulés = Messages prêts + Messages en cours de traitement - Messages ne correspondant pas au filtre

  • Filtrage basé sur les tags : Messages accumulés = (Messages prêts + Messages en cours de traitement) x Taux de correspondance des tags

Taux de correspondance des tags = Messages correspondant au tag dans l'échantillon / Total des messages échantillonnés.

FAQ

Pourquoi les consommateurs d'un même groupe perdent-ils des messages lorsqu'ils s'abonnent à des tags différents ?

Tous les consommateurs d'un groupe de consommateurs doivent utiliser la même expression de filtre. Si le consommateur A s'abonne à TagA tandis que le consommateur B s'abonne à TagB, une incohérence d'abonnement se produit et des messages sont perdus. Alignez les expressions de filtre sur tous les consommateurs du groupe ou répartissez-les dans des groupes de consommateurs distincts.

Comment le nombre de messages consommés est-il calculé lorsque le filtrage est actif ?

Seuls les messages validant l'expression de filtre sont comptabilisés dans la consommation. Les messages filtrés sont exclus du décompte.

Pourquoi des messages s'accumulent-ils alors que les consommateurs affichent une consommation nulle ?

Les messages ne correspondant pas au filtre actif existent toujours dans le topic et sont pris en compte dans le backlog. Ce comportement est attendu. Consultez la section Calcul des messages accumulés pour obtenir les formules exactes.

Étapes suivantes

Pour des exemples de code SDK complets couvrant le filtrage des messages, consultez la rubrique Présentation de la référence SDK.