Ventiler les messages vers de nombreux groupes de consommateurs dans une file d'attente
Ventilez les messages d'une file d'attente OCI unique vers de nombreux groupes de destinataires et appliquez des filtres pour chaque groupe, ce qui permet d'utiliser des messages d'application à application évolutifs, à faible latence et basés sur l'extraction
Avec fanout, vous pouvez envoyer un message à différents groupes de consommateurs en même temps, ce qui facilite le partage des mises à jour avec de nombreuses équipes ou services à partir d'une seule file d'attente. Cela est utile car vous pouvez contrôler exactement qui reçoit quels messages, de sorte que chaque groupe ne voit que ce qui est pertinent pour eux.
Pour utiliser le fanout, vous devez créer des filtres qui évaluent les attributs de message associés à chaque message. Seuls les groupes de consommateurs de ressources pour lesquels le filtre renvoie true reçoivent le message.
Groupes de destinataires
Le groupe principal s'assure que chaque message a une destination. Lorsque vous définissez le groupe de consommateurs de ressources principal sur Inactif, vous ne recevez pas de messages via ce groupe. Le système supprime tous les messages envoyés alors que le groupe principal est inactif et ne correspond pas aux filtres des autres groupes ; ces messages ne peuvent pas être récupérés. Pour éviter de perdre des messages, conservez le groupe de destinataires principal activé, sauf si vous avez spécifiquement l'intention de supprimer certains messages.
Outre le groupe de destinataires par défaut, vous pouvez ajouter autant de groupes de destinataires que nécessaire pour transmettre des messages à des destinataires spécifiques. Chaque groupe fonctionne indépendamment des autres, de sorte que les messages sont livrés, filtrés et suivis séparément, garantissant ainsi l'isolement et l'équité entre les consommateurs. Vous pouvez définir un filtre pour chaque groupe afin de contrôler les messages qu'il reçoit. Si vous ne définissez pas de filtre ou laissez le filtre vide, le groupe reçoit tous les messages, comme pour le groupe par défaut.
Voici un aperçu des différences entre le groupe de consommateurs par défaut (principal) et les groupes de consommateurs que vous créez :
| Fonction | Groupe de consommateurs par défaut (principal) | Autres groupes de consommateurs |
|---|---|---|
| Création | Créé automatiquement lorsque les groupes de consommateurs de ressources sont activés | Créé manuellement si nécessaire |
| Peut être supprimé | Non | Oui |
| Peut être désactivé | Oui | Oui |
| Peut contenir des filtres | Non | Oui |
| Reçoit tous les messages | Oui, si activé | Seuls les messages correspondant à son filtre ou tous les messages si aucun filtre n'est défini |
| Le nombre de livraisons DLQ peut être défini | Non | Oui |
| OCID | Identique à l'OCID de file d'attente | OCID unique par groupe |
Exemple de syntaxe
Supposons que vous créez une file d'attente pour les événements de facturation. Le groupe de consommateurs de ressources par défaut est destiné à l'équipe de conformité de la facturation, qui doit recevoir tous les messages pour des raisons de conformité. Vous ajoutez également un autre groupe de consommateurs de ressources pour l'équipe qui gère les dépenses de direction et définissez un filtre afin que ce groupe ne reçoive que les messages avec l'attribut team = "exec-expenses". Cela réduit le bruit pour l'équipe des dépenses de direction en s'assurant qu'ils n'obtiennent que le message pertinent.
Messages et attributs
Un message peut éventuellement inclure des attributs, paires clé-valeur ajoutées par le fournisseur en tant qu'informations supplémentaires (métadonnées). Les attributs peuvent décrire n'importe quel détail du message (par exemple, région, priorité ou type d'événement) et vous aider à effectuer un filtrage et un ciblage précis des messages pour les groupes de destinataires.
Voici quelques directives pour les émetteurs lors de la création d'attributs :
- Les valeurs et les clés d'attribut sont sensibles à la casse.
- Les valeurs d'attribut doivent être l'un des types de données pris en charge suivants :
- Chaîne : chaîne codée en UTF-8.
- Nombre : valeur numérique entière ou décimale.
- Les attributs sont pris en compte dans la taille totale des messages.
- Les clés d'attribut doivent commencer par une lettre ou un caractère de soulignement (_).
- Les clés d'attribut peuvent uniquement inclure des lettres, des chiffres, des traits d'union (-) ou des traits de soulignement (_).
- N'utilisez pas de guillemets autour des clés.
Filtrage
Les filtres fonctionnent uniquement avec les attributs de message, et non avec le corps du message.
Vous créez des filtres lorsque vous créez un groupe de consommateurs de ressources. Chaque groupe de consommateurs de ressources peut avoir son propre filtre et vous pouvez en créer un par groupe.
Une expression de filtre est une règle de type SQL que vous écrivez pour décider quels messages un groupe reçoit.
Filtrer les contraintes d'expression
- Les expressions de filtre sont sensibles à la casse. Par exemple,
:region = "us-ashburn-1"est différent de:region = "US-ASHBURN-1". - Les expressions de filtre peuvent comporter jusqu'à 256 caractères.
Filtrer l'évaluation
- Service de file d'attente vérifie les filtres uniquement lorsqu'un message est publié pour la première fois dans la file d'attente.
- Service de file d'attente vérifie les filtres uniquement lorsqu'un message est publié pour la première fois dans la file d'attente. Si vous réactivez ultérieurement un groupe de consommateurs de ressources ou modifiez son filtre, les messages existants dans la file d'attente ne sont pas évalués rétroactivement. Seuls les nouveaux messages sont comparés au filtre mis à jour.
- Si aucun filtre de groupe de destinataires ne correspond à un message et que le groupe principal est désactivé, le message est supprimé et ne peut pas être extrait. La file d'attente émet une mesure à chaque fois qu'un message est supprimé. Vous pouvez visualiser cette mesure dans la console dans Queue Service ou dans OCI Monitoring.
Modèle d'expressions de filtre
Voici les types d'expression de filtre que vous pouvez utiliser :
Présence clé
Utilisez des filtres de présence clés pour vérifier si un message inclut ou manque un attribut donné.
Voici quelques exemples d'expressions de filtre :
:region: met en correspondance les messages dont l'attributregionest défini, quelle que soit sa valeur.NOT :region: correspond aux messages qui n'ont pas l'attributregion.
Filtres de chaîne
Utilisez des filtres de chaîne pour mettre en correspondance les messages en fonction de la valeur d'un attribut de texte. Vous pouvez vérifier les correspondances exactes, les différences ou les modèles dans le texte.
Voici quelques exemples d'expressions de filtre :
:name = "Bob": met en correspondance les messages dont l'attributnameest exactement "Bob".:name != "Bob": met en correspondance les messages dont l'attributnamen'est pas "Bob".hasPrefix(:name, "Bo"): met en correspondance les messages où l'attributnamecommence par 'Bo'.hasSuffix(:name, "ob"): met en correspondance les messages où l'attributnamese termine par "ob".NOT hasPrefix(:name, "Bo"): correspond aux messages où l'attributnamene commence pas par 'Bo'.
Nombre de filtres
Utilisez des filtres numériques pour mettre en correspondance les messages en fonction de la valeur d'un attribut numérique.
Voici quelques exemples :
:age = 40: met en correspondance les messages dont l'attributageest exactement égal à 40.:age != 40: met en correspondance les messages dont l'attributagen'est pas 40.:age > 40: met en correspondance les messages dont l'attributageest supérieur à 40.:age >= 40: met en correspondance les messages dont l'attributageest supérieur ou égal à 40.:age < 40: met en correspondance les messages dont l'attributageest inférieur à 40.:age <= 40: met en correspondance les messages dont l'attributageest inférieur ou égal à 40.
Filtres logiques
La priorité de l'opérateur est la suivante : les parenthèses ( ) ont la priorité la plus élevée, suivies de NOT, AND et OR.
Voici quelques exemples :
:name = "Bob" AND :age = 40: met en correspondance les messages dont l'attributnameest "Bob" etage40.:name = "Bob" OR :age = 40: met en correspondance les messages dont l'attributnameest "Bob" ouagea la valeur 40.:name = "Bob" AND NOT :age: met en correspondance les messages où l'attributnameest "Bob" et où il n'existe aucun attributage.
Filtres complexes
La priorité de l'opérateur est la suivante : les parenthèses ( ) ont la priorité la plus élevée, suivies de NOT, AND et OR.
Voici un exemple :
:name = "Bob" AND NOT (:age > 40 OR :location = "Chicago"): met en correspondance les messages dont l'attributnameest "Bob" etagen'est pas supérieur à 40 oulocationn'est pas "Chicago".
Stratégies IAM
Passez en revue les stratégies IAM requises pour utiliser les groupes de destinataires et les groupes de destinataires.
Bonnes pratiques
- Commencez par de petits filtres pour vérifier que la distribution des messages fonctionne comme prévu. Ajoutez lentement une logique de filtre complexe, en effectuant des tests au fur et à mesure.
- Surveillez la mesure des messages supprimés dans OCI Monitoring. Cela vous permet de détecter les messages supprimés car aucun filtre ne correspond.
- Utilisez un nom cohérent pour les attributs de message de tous les émetteurs. Cela rend l'écriture et la maintenance des filtres plus faciles et plus fiables.
- Si une clé d'attribut ne suit pas les règles [à partir d'une lettre ou d'un trait de soulignement (_), incluez uniquement des lettres, des chiffres, des traits d'union (-) ou des traits de soulignement (_)], ajoutez-la entre guillemets dans l'expression de filtre.