Le modèle de file d’attente à priorité permet à une charge de travail de traiter les tâches à haute priorité plus rapidement que les tâches à faible priorité. Ce modèle utilise des messages envoyés à une ou plusieurs files d’attente et est utile dans les applications qui offrent différentes garanties de niveau de service aux clients individuels.
Contexte et problème
Les charges de travail doivent souvent gérer et traiter des tâches avec des niveaux d’importance et d’urgence variés. Certaines tâches nécessitent une attention immédiate tandis que d’autres peuvent attendre. Ne pas traiter les tâches à haute priorité peut affecter l’expérience utilisateur et enfreindre les accords de niveau de service (SLA).
Pour traiter les tâches efficacement en fonction de leur priorité, les charges de travail ont besoin d’un mécanisme pour prioriser et exécuter les tâches en conséquence. Typiquement, les charges de travail traitent les tâches dans l’ordre de leur arrivée, en utilisant une structure de file d’attente FIFO (premier arrivé, premier servi). Cette approche ne prend pas en compte l’importance variable des tâches.
Solution
Les files d’attente à priorité permettent aux charges de travail de traiter les tâches en fonction de leur priorité plutôt que de leur ordre d’arrivée. L’application envoyant un message à la file d’attente attribue une priorité au message, et les consommateurs traitent les messages par priorité. Utilisez le modèle de file d’attente à priorité lorsque vous avez les exigences suivantes :
Gérer des tâches d’urgence et d’importance variées. Vous avez des tâches avec différents niveaux d’urgence et d’importance et devez vous assurer de traiter les tâches plus critiques avant les moins critiques.
Gérer différents accords de niveau de service. Vous offrez différentes garanties de niveau de service aux clients et devez vous assurer que les clients à haute priorité reçoivent de meilleures performances et une meilleure disponibilité.
Répondre à différents besoins de gestion des charges de travail. Vous avez une charge de travail qui doit traiter certaines tâches immédiatement tandis que les tâches moins urgentes peuvent attendre.
Il existe deux approches principales pour mettre en œuvre le modèle de file d’attente à priorité :
File d’attente unique : Tous les messages sont envoyés à une seule file d’attente et chaque message se voit attribuer une priorité.
Multiples files d’attente : Des files d’attente séparées sont utilisées pour chaque priorité de message.
File d’attente unique
Avec une file d’attente unique, l’application (producteur) attribue une priorité à chaque message et envoie le message à la file d’attente. La file d’attente ordonne les messages par priorité, garantissant que les consommateurs traitent les messages à haute priorité avant ceux à faible priorité.
Figure 1. Architecture d’une file d’attente unique et d’un pool de consommateurs unique
Files d’attente multiples
Les multiples files d’attente permettent de séparer les messages par priorité. L’application attribue une priorité à chaque message et dirige le message vers la file d’attente correspondant à sa priorité. Les consommateurs traitent les messages. Une solution de files d’attente multiples utilise soit un pool de consommateurs unique, soit plusieurs pools de consommateurs.
Multiples pools de consommateurs
Avec plusieurs pools de consommateurs, chaque file d’attente a des ressources de consommateurs dédiées. Les files d’attente à haute priorité devraient utiliser plus de consommateurs ou des niveaux de performance plus élevés pour traiter les messages plus rapidement que les files d’attente à faible priorité.
Utilisez plusieurs pools de consommateurs lorsque vous avez :
- Exigences de performance strictes : Plusieurs pools de consommateurs sont nécessaires lorsque différentes priorités de tâches ont des exigences de performance strictes qui doivent être respectées indépendamment.
- Besoins de haute fiabilité : Plusieurs pools de consommateurs sont requis pour les applications où la fiabilité et l’isolation des pannes sont cruciales. Les problèmes dans une file d’attente ne doivent pas affecter les autres files d’attente.
- Applications complexes : Bénéfique pour les applications complexes avec des tâches nécessitant des caractéristiques de traitement différentes et des garanties de performance pour différentes tâches.
Figure 2 : Architecture de multiples files d’attente et multiples pools de consommateurs.
Pool de consommateurs unique
Avec un pool de consommateurs unique, toutes les files d’attente partagent un seul pool de consommateurs. Les consommateurs traitent les messages de la file d’attente à la plus haute priorité en premier et ne traitent les messages des files d’attente à faible priorité que lorsqu’il n’y a pas de messages à haute priorité. En conséquence, le pool de consommateurs unique traite toujours les messages à haute priorité avant les messages à faible priorité. Cette configuration pourrait entraîner des retards continus pour les messages à faible priorité et éventuellement ne jamais les traiter.
Utilisez un pool de consommateurs unique pour :
- Gestion simple : Un pool de consommateurs unique convient aux applications où la facilité de configuration et de maintenance est une priorité. Cela réduit la complexité de la configuration et de la surveillance.
- Besoins de traitement unifiés : Un pool de consommateurs unique est utile lorsque la nature exacte des tâches entrantes est similaire.
Figure 3. Architecture de multiples files d’attente et d’un pool de consommateurs unique.
Recommandations pour le modèle de file d’attente à priorité
Considérez les recommandations suivantes lorsque vous décidez comment mettre en œuvre le modèle de file d’attente à priorité :
Recommandations générales
Définissez clairement les priorités. Établissez des niveaux de priorité distincts et clairs pertinents pour votre solution. Par exemple, un message à haute priorité pourrait nécessiter un traitement dans les 10 secondes. Identifiez les exigences pour le traitement des éléments à haute priorité et allouez les ressources nécessaires en conséquence.
Ajustez dynamiquement les pools de consommateurs. Échelonnez la taille des pools de consommateurs en fonction de la longueur de la file d’attente qu’ils desservent.
Priorisez les niveaux de service. Mettez en œuvre des files d’attente à priorité pour répondre aux besoins commerciaux nécessitant une disponibilité ou une performance prioritaire. Par exemple, différents groupes de clients peuvent recevoir des niveaux de service variés pour que les clients à haute priorité bénéficient de meilleures performances et disponibilité.
Assurez-vous du traitement des messages à faible priorité. Dans les files d’attente prenant en charge la priorisation des messages, augmentez dynamiquement la priorité des messages âgés si le système le permet pour garantir que les messages à faible priorité soient finalement traités.
Considérez les coûts des files d’attente. Soyez conscient des coûts financiers et de traitement associés à la vérification des files d’attente. Certains services de file d’attente facturent des frais pour la publication, la récupération et l’interrogation des messages, ce qui peut augmenter avec le nombre de files d’attente.
Recommandations pour les files d’attente multiples
Surveillez les vitesses de traitement. Pour vous assurer que les messages sont traités aux taux attendus, surveillez continuellement la vitesse de traitement des files d’attente à haute et basse priorité.
Réduire les coûts. Traitez les tâches critiques immédiatement avec les consommateurs disponibles. Planifiez les tâches de fond moins critiques pendant les périodes moins occupées.
Recommandations pour un pool de consommateurs unique
Mettez en œuvre la préemption et la suspension. Décidez si tous les éléments à haute priorité doivent être traités avant tout élément à faible priorité. Utilisez un algorithme qui garantit que les files d’attente à haute priorité sont toujours desservies avant les files d’attente à faible priorité lors de l’utilisation d’un seul pool de consommateurs pour plusieurs files d’attente.
Optimiser les coûts. Optimisez les coûts opérationnels en réduisant le nombre de consommateurs lors de l’utilisation de l’approche de file d’attente unique. Les messages à haute priorité sont traités en premier, bien que peut-être plus lentement, tandis que les messages à faible priorité peuvent subir des délais plus longs.
Conception de la charge de travail
Un architecte doit évaluer comment le modèle de file d’attente à priorité peut répondre aux objectifs et principes couverts dans les piliers du cadre bien architecturé Azure. Par exemple :
Pilier | Comment ce modèle soutient les objectifs des piliers. |
---|---|
Les décisions relatives à la fiabilité contribuent à rendre votre charge de travail résiliente aux dysfonctionnements et à s’assurer qu’elle retrouve un état de fonctionnement optimal après une défaillance. | La séparation des éléments en fonction de la priorité métier vous permet de concentrer les efforts de fiabilité sur le travail le plus critique. - RE :02 Flux critiques - RE :07 Travaux en arrière-plan |
L’efficacité des performances permet à votre charge de travail de répondre efficacement aux demandes grâce à des optimisations de la mise à l’échelle, des données, du code. | Séparer les éléments en fonction de la priorité commerciale vous permet de concentrer les efforts de fiabilité sur le travail le plus critique. - PE :09 Flux critiques |
Comme pour toute autre décision de conception, il convient de prendre en compte les compromis par rapport aux objectifs des autres piliers qui pourraient être introduits avec ce modèle.
Exemple du modèle de file d’attente à priorité
L’exemple suivant dans GitHub démontre une implémentation du modèle de file d’attente à priorité en utilisant Azure Service Bus.
Figure 4. Architecture de l’exemple PriorityQueue dans GitHub
Voici un aperçu de l’architecture :
Application (producteur) : L’exemple comprend une application (
PriorityQueueSender
) qui crée des messages et attribue une propriété personnalisée appeléePriority
dans chaque message.Priority
a la valeurHigh
ouLow
.Broker de messages et files d’attente : L’exemple utilise Azure Service Bus comme broker de messages. Il utilise deux files d’attente Azure Service Bus, une pour chaque priorité de message (
High
etLow
). L’application (producteur) envoie les messages à la file d’attente correcte en fonction de la priorité du messagePriority
.Multiples pools de consommateurs : L’exemple utilise plusieurs pools de consommateurs (
PriorityQueueConsumerHigh
etPriorityQueueConsumerLow
) dédiés à la lecture des messages de chacune des files d’attente.
Rôle dans l’architecture de l’exemple | Service Azure dans l’exemple | Nom dans l’exemple |
---|---|---|
Application | Application Azure Functions | PriorityQueueSender |
Broker de messages | Azure Service Bus | <votre espace de noms de bus de service> |
Files d’attente de messages | Files d’attente Azure Service Bus | <vos noms de files d’attente> |
Consommateurs | Application Azure Functions | PriorityQueueConsumerHigh PriorityQueueConsumerLow |
Ressources associées
Les modèles suivants peuvent vous être utiles lorsque vous implémentez ce modèle :
Modèle de consommateurs concurrents : Ce modèle implique la mise en œuvre de plusieurs consommateurs qui écoutent la même file d’attente et traitent les tâches en parallèle pour augmenter le débit. Un seul consommateur traite chaque message. L’article fournit des informations détaillées sur les avantages et les inconvénients de cette approche.
Modèle de régulation : Ce modèle peut être mis en œuvre en utilisant des files d’attente pour gérer les taux de requêtes. En utilisant la priorisation des messages, les requêtes des applications critiques ou des clients de grande valeur peuvent être prioritaires par rapport à celles moins importantes.