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

Le producteur joint un tag ou des attributs personnalisés à chaque message.
Le consommateur enregistre une expression de filtre auprès du broker lors de l'abonnement à un topic.
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,
TagAettagAsont 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 :

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

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