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

Un groupe de consommateurs est un chemin de distribution logique persistant au sein d'une file d'attente. Chaque groupe de destinataires reçoit les messages séparément, en fonction des filtres que vous définissez.
Remarque

Vous devez activer les groupes de destinataires pour pouvoir les utiliser dans une file d'attente. Vous pouvez le faire lorsque vous créez ou modifiez une file d'attente.
Lorsque vous activez des groupes de consommateurs pour une file d'attente, le service de file d'attente crée automatiquement un groupe par défaut appelé groupe de consommateurs principal. Bien que vous ne puissiez pas ajouter de filtres au groupe par défaut ou le supprimer, vous pouvez le désactiver si nécessaire. Vous pouvez considérer ce groupe comme un surensemble : tant qu'il est activé, il reçoit tous les messages publiés dans la file d'attente, quels que soient les filtres définis pour les autres groupes.
Remarque

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.
Voici quelques conseils pour nommer les clés d'attribut :
  • 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

Utilisez filters pour contrôler les messages qu'un groupe de destinataires reçoit. Lorsqu'un message est publié, le service de file d'attente vérifie le filtre par rapport aux attributs de chaque message pour déterminer si le message doit être transmis à ce groupe de destinataires. Un message est transmis à un groupe de consommateurs de ressources uniquement si son filtre correspond aux attributs
Remarque

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

Voici les règles qui définissent la façon dont vous écrivez et utilisez les expressions de filtre, de sorte que les filtres fonctionnent comme vous le souhaitez :
  • 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

Voici ce qui se passe lorsque le service OCI Queue vérifie les filtres et ce qui se passe pour les messages qui ne correspondent à aucun filtre :
  • 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'attribut region est défini, quelle que soit sa valeur.
  • NOT :region : correspond aux messages qui n'ont pas l'attribut region.

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'attribut name est exactement "Bob".
  • :name != "Bob" : met en correspondance les messages dont l'attribut name n'est pas "Bob".
  • hasPrefix(:name, "Bo") : met en correspondance les messages où l'attribut name commence par 'Bo'.
  • hasSuffix(:name, "ob") : met en correspondance les messages où l'attribut name se termine par "ob".
  • NOT hasPrefix(:name, "Bo") : correspond aux messages où l'attribut name ne 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'attribut age est exactement égal à 40.
  • :age != 40 : met en correspondance les messages dont l'attribut age n'est pas 40.
  • :age > 40 : met en correspondance les messages dont l'attribut age est supérieur à 40.
  • :age >= 40 : met en correspondance les messages dont l'attribut age est supérieur ou égal à 40.
  • :age < 40 : met en correspondance les messages dont l'attribut age est inférieur à 40.
  • :age <= 40 : met en correspondance les messages dont l'attribut age est inférieur ou égal à 40.

Filtres logiques

Utilisez des opérateurs logiques pour combiner des règles et créer des filtres plus flexibles. Les opérateurs pris en charge sont AND, OR et NOT.
Remarque

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'attribut name est "Bob" et age 40.
  • :name = "Bob" OR :age = 40 : met en correspondance les messages dont l'attribut name est "Bob" ou age a la valeur 40.
  • :name = "Bob" AND NOT :age : met en correspondance les messages où l'attribut name est "Bob" et où il n'existe aucun attribut age.

Filtres complexes

Utilisez une logique plus complexe en combinant plusieurs filtres avec des parenthèses et plusieurs opérateurs logiques.
Remarque

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'attribut name est "Bob" et age n'est pas supérieur à 40 ou location n'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.