Skip to content

Azure Service Bus

General

Docs

Pricing

  • https://azure.microsoft.com/en-us/pricing/details/service-bus/
  • Tier Basic, Standard, Premium, permet d'offrir plus ou moins de features
  • Les avantages du Standard:
    • Facturation 3 facteurs:
      • Forfait horaire
      • Package en millions d'opérations
      • Package en nombre de connections
    • Définition d'une opération:
      • Toute interaction avec le service peut importe l'API, dont la taille et <= à 64KB (= chaque appel d'API)
        • Reception d'un message
        • Lecture d'un message
        • Suppression d'un message
        • etc. => endpoint pour queue, topic, subscription et controle plane
      • Si > alors le nombre d'opérations retenue est le quotient de la division par 64KB
      • Egalement les traitements au seins même du service entrent en compte (par ex: une duplication d'un msg sur 3 souscriptions = 3 ops)
  • Les avantages du Premium:
    • Option Geo Disaster Recovery
    • Mode Isolation (ressources dédiés au niveau CPU et mémoire) => performances predictibles
    • Support AZ
    • Support JMS 2.0
    • Facturation à l'heure par taille de Messaging Unit par namespace, pas de coûts supplémentaires pour les opérations ou connections
    • Msg size 100MB
    • Précisions sur Messaging Unit:
      • Capacité de 1, 2, 4, 8, 16 Messaging Units
      • Daily rate retenu est le nombre max de messaging unit assigné par namespace dans la journée

SLA

Concepts

Message

  • Données de n'importe quel type (Content-Type)
  • Metadata pour permettre à la donnée de transiter dans le service

Queue

  • Use case: point to point messaging
  • File ordonnée de message (FIFO)
  • Timestamp chaque message
  • fonctionne en pull-mode A ECLAIRCIR
  • 2 modes de lecture possible:
    • at most once (au mieux 1 mais peut être aucun):
      • Fonctionnement Receive & Delete: Le message est marqué "delivré" dès que le lecteur demande le message, charge à lui de ne pas le perdre
      • Si l'appli plante avant d'avoir traité le message, celui-ci est perdu
    • at least once (au moins 1 mais peut etre plus):
      • Fonctionnement Peek Lock: 1) Le message est marqué "lock" dès qu'un lecteur demande un message 2) Le lecteur traite le message de son côté 3) Le lecteur marque le message "consumed" lorsqu'il a terminé
      • Le message peut être marqué "abandoned" par le lecteur afin de signaler à SB qu'il est de nouveau disponible à la lecture pour les autres
      • Un timeout associé au message remet le message en disponibilité si le lecteur ne l'a pas marqué "consumed" dans le temps imparti
      • Si l'application demande un nouveau message à SB avant d'avoir marqué le précédent "consumed" alors SB redonne le message qui à priori vient d'être traité (d'où le "au moins 1")
    • exactly once:
      • Fonctionnement en Peek Lock
      • L'activation de la feature Duplicate Detection permet à SB de ne pas redélivrer un message à un lecteur qui l'aurait déjà eu mais qui n'aurait pas eu le temps de marquer le message "consumed" (par ex. à cause d'un crash)

Topics & Subscriptions

  • Use Case: n..n messaging
  • Possède 1..n Entites (aka Subscriptions)
  • Entities (aka Subscription):
    • Permet le multiplexing d'un message arrivant dans un topic pour le mettre à dispo à différents Reader en //
    • Le message arrivant de le topic est copié dans chaque souscription composant le topic
    • Côté Lecteur, une souscription est l'équivalent d'une queue mais dédié que pour lui (et fonctionne pareil pour la lecture)
    • Filter de la souscription permet d'ajouter des règles sur la condition de la recopie
    • Action de la souscription permet de modifier les metadatas de la copie du message pour la souscription

Namespace

  • Conteneur de Queues et Topics
  • Offre une capacité de traitement
  • En Premium la capacité du namespace est fournie par le nombre de Message Units associés au namespace

Features

Auto-delete

  • Permet de définir un interval de temps après lequel une queue est vidée

Auto-forwarding

  • Permet le routage automatique d'un message d'une queue ou subscription vers une autre queue ou subscription
  • Uniquement si source et cible sont dans le même namespace

Dead-lettering

  • Permet de stocker les messages qui posent problèmes à être transmis dans une queue pour inspection future

Duplicate Detection

  • Use Case:
    • Un Producer envoie des messages à un Topic
    • Le Producer rompt la communication avec le Topic immédiatement après avoir envoyé le message (par ex: il plante)
    • Lorsqu'il établit de nouveau la communication, il faut un moyen pour le Producer de détecter que le dernier message qu'il a traité a bien été envoyé au Topic et ce même s'il n'a pas pu le marquer comme tel autrement le message va être envoyé une seconde fois dans le Topic pouvant causer des problèmes de cohérence de données
  • Permet à la queue ou au topic de supprimer automatiquement les doublons de message arrivant des Producer
  • La dédup s'appuie sur le MessageId du message pour le conserver ou le drop
  • Le MessageId doit être défini du côté applicatif
  • Si Partitionning activé:
    • L'identifiant du message correspond au MessageId+PartitionKey
    • Si Message Session est également activé, le SessionId doit être identique au PartitionKey
  • Configuration de la durée de l'historique des messages pour détecter un doublon:
    • Default: 10min
    • Min: 20sec
    • Max: 7jrs

Message Deferral

  • Permet de mettre la transmission d'un message en attente dans une queue ou un topic
  • Il est comme "mis sur le côté" - A ECLAIRCIR: donc les messages suivants peuvent etre tout de meme traités?

Message Session (aka Ordering)

  • Use Case:
    • Un lot de messages formant un flow de transaction est envoyé vers une queue/souscription
    • Ceux-ci arrivent parmis d'autres messages qui n'ont rien à voir avec ce flow
    • Pour un Reader, il faut un moyen de lire les messages qui sont liés à ce flow uniquement et ne pas être "pollué" par des messages qui n'ont rien à voir avec ce flow
  • Géré au niveau applicatif en définissant le sessionID (group-id en AMQP) dans les messages qui constituent la session
  • Lorsque SB détecte la propriété il fonctionne en mode "session"
  • Les producers continuent d'envoyer des messages aux topics, chacun avec leurs numéros de sessions
  • Lorsqu'un reader lit une session (= Accept session):
    • Il possède un lock exclusif sur tous les messages avec le même sessionID dans la queue/souscription
    • Le lock s'applique également aux messages qui arriveront dans la queue/souscription
    • Le reader peut ainsi lire l'ensemble des messages d'une session et ce peu importe s'ils ne sont pas arrivés d'un bloc dedans (= s'ils sont entrelacés avec d'autres messages qui n'ont rien à voir avec cette session)
    • Le lock est relâché par appel de close() du reader ou bien lorsque le TTL du lock expire
    • 1 seul lock possible par session (= 1 seul reader par session)
  • Session State:
    • Le reader peut stocker des données de contextes d'une session directement au niveau de SB pour cette session
    • Méthodes SetState et GetState
    • Doit être géré au niveau applicatif Reader, le reader y met ce qu'il veut dans cet espace
    • Il faut clean le session state lorsque la session est terminée autrement l'espace de stockage continue d'être consommé

Partitionning

Protocoles

  • AMQP 1.0:
    • Interface par défaut
    • Assure une portabilité avec les produits du marché
  • JMS 1.1: via le tier Standard
  • JMS 2.0: via le tier Premium
  • HTTP/REST

Schedule delivery

  • Permet de spécifier un temps avant que le message ne soit transmis

Transaction

  • Permet de grouper plusieurs operation dans un traitement atomique
  • Est supporté au niveau Queue, Topic et Subscription

BCDR

  1. Insulate Azure Service Bus applications against outages and disasters - Azure Service Bus | Microsoft Learn
  2. Azure Service Bus Geo-disaster recovery - Azure Service Bus | Microsoft Learn
  3. Message replication and cross-region federation - Azure Service Bus - Azure Service Bus | Microsoft Learn

Tier Premium

  • réplication 3-active sur 3 availability zone de la région Azure , ce qui devrait assurer un haut niveau d’uptime (le SLA du service est à 99.9%).
  • Attention toutefois: le SDK intègre déjà une logique de retry s’il perçoit un problème de connexion au endpoint, ce qui signifie que l’application qui utilise l’API REST doit implémenter sa propre logique
  • voir le pattern Retry : Retry pattern - Azure Architecture Center | Microsoft Learn
  • Le cas qui non couvert est celui d’un regional failure:
  • il faut s’appuyer d’une part sur la feature Geo Disaster Recovery du tier Premium afin de répliquer la configuration de l’instance du service vers une autre instance SB dans une autre région
  • d’autre part prévoir une réplication des messages (voir lien n°3) pour assurer le RPO qui convient, ce qui pose des contraintes de gestion des doublons/acquittements de messages répliqués en plus de poser des contraintes de performances (l’article n°3 propose différents pattern d’implémentation en fonction des cas à gérer).