Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Hiérarchiser les demandes envoyées aux services afin qu’une charge de travail traite les requêtes de priorité élevée plus rapidement que les requêtes de priorité inférieure. Cette approche utilise des messages envoyés à une ou plusieurs files d’attente et est utile pour les applications qui fournissent différents niveaux de service ou contrats de niveau de service (SLA) à différents types de demandes ou clients.
Contexte et problème
Les charges de travail peuvent avoir besoin de gérer et de traiter des tâches avec différents niveaux d’importance et d’urgence. Certaines tâches nécessitent une attention immédiate tandis que d’autres peuvent attendre. L’échec de la résolution des tâches à priorité élevée peut affecter l’expérience utilisateur et les contrats SLA de violation.
Pour gérer efficacement les tâches en fonction de leur priorité, les charges de travail ont besoin d’un mécanisme pour traiter et exécuter des tâches en conséquence. Par défaut, la plupart des charges de travail traitent les tâches dans l’ordre dans lequel elles arrivent, à l’aide d’une structure de file d’attente de première entrée et de première sortie (FIFO). Cette approche ne tient pas compte de l’importance variable des tâches.
Solution
Les files d’attente prioritaires permettent aux charges de travail de traiter les tâches en fonction de leur priorité plutôt que strictement par leur ordre d’arrivée. L’application ou le producteur qui envoie une demande affecte une valeur de priorité au message, et les consommateurs traitent les messages par priorité. Le modèle File d’attente prioritaire répond aux exigences suivantes :
Gère les tâches d’urgence et d’importance variables : Vous avez des tâches avec différents niveaux d’urgence et d’importance et devez vous assurer que vous traitez des tâches plus critiques avant les tâches moins critiques.
Gère différents contrats SLA : Vous proposez différents contrats SLA à différents clients et devez vous assurer que les clients à priorité élevée reçoivent de meilleures performances et disponibilité.
Convient aux différents besoins de gestion des charges de travail : Vous disposez d’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 : Chaque message reçoit une valeur de priorité et tous les messages utilisent la même file d’attente.
Plusieurs files d’attente : Chaque message reçoit une valeur de priorité, et les messages de priorité différente utilisent des files d’attente distinctes.
File d’attente unique
Dans une approche de file d’attente unique, l’application affecte une priorité à chaque message et envoie tous les messages à une seule 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é.
Files d’attente multiples
Plusieurs files d’attente séparent les messages par priorité. L’application affecte une priorité à chaque message et dirige le message vers la file d’attente qui correspond à sa priorité, où les consommateurs traitent les messages. Une solution à plusieurs files d’attente peut utiliser un pool unique de consommateurs ou plusieurs pools de consommateurs.
Pool de consommateurs unique
Dans une configuration de pool unique, toutes les files d’attente partagent le même pool de consommateurs. Les consommateurs traitent les messages de la file d’attente de priorité la plus élevée en premier et traitent les messages à partir de files d’attente de priorité inférieure uniquement lorsqu’il n’y a plus de messages de priorité élevée. Par conséquent, les pools de consommateurs uniques traitent toujours les messages de priorité supérieure avant les messages de priorité inférieure. Cette configuration peut entraîner un retard continu des messages de priorité inférieure et potentiellement jamais traités.
Utilisez un pool de consommateurs unique pour les raisons suivantes :
Gestion simple. Utilisez un pool de consommateurs unique quand une configuration et une maintenance simples sont prioritaires. Un pool unique réduit la complexité de la configuration et de la surveillance.
Besoins de traitement unifiés. Utilisez un pool de consommateurs unique lorsque les tâches entrantes sont similaires dans le type.
Multiples pools de consommateurs
Dans un pool de consommateurs multiples, chaque file d’attente a un pool de consommateurs dédié. Les files d’attente de priorité supérieure utilisent plus de consommateurs ou de niveaux de performances supérieurs pour traiter les messages plus rapidement que les files d’attente de priorité inférieure.
Utilisez plusieurs pools de consommateurs pour les raisons suivantes :
Exigences strictes en matière de performances. Utilisez plusieurs pools de consommateurs lorsque différentes priorités de tâche ont des exigences strictes en matière de performances qui doivent être remplies indépendamment.
Besoins de haute fiabilité. Utilisez plusieurs pools de consommateurs pour les applications lorsque la fiabilité et l’isolation des erreurs sont critiques et que les problèmes d’une file d’attente ne doivent pas affecter d’autres files d’attente.
Applications complexes. Utilisez plusieurs pools de consommateurs pour les applications complexes où différentes tâches nécessitent des caractéristiques de traitement et des garanties de performances différentes.
Problèmes et considérations
Prenez en compte les points suivants lorsque vous choisissez comment implémenter ce modèle :
Recommandations générales
Définissez clairement les priorités. Établissez des niveaux de priorité distincts et clairs pertinents pour votre solution. Par exemple, vous pouvez définir des messages à priorité élevée comme ceux qui nécessitent un traitement dans les 10 secondes. Identifiez les exigences du consommateur pour la gestion des éléments à priorité élevée et allouez les ressources nécessaires en conséquence.
Ajustez dynamiquement les pools de consommateurs. Mettez à l’échelle la taille des pools de consommateurs en fonction de la longueur de la file d’attente qu’ils effectuent.
Surveillez l’intégrité de la file d’attente. Suivez la profondeur de file d’attente, la latence de traitement, le nombre de livraisons et le débit afin de détecter les backlogs et les ralentissements avant qu’ils n’affectent le travail.
Utilisez des files d’attente de lettres mortes. Déplacez les messages incohérents vers une file d’attente de lettres mortes après un nombre configurable de tentatives de remise afin qu’un message incorrect ne bloque pas le chemin de priorité.
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, les clients à priorité élevée peuvent recevoir un niveau de service plus élevé afin qu’ils bénéficient d’une meilleure performance et d’une meilleure disponibilité.
Envisagez un traitement de faible priorité. Déterminez si tous les éléments à priorité élevée doivent être traités avant les éléments de priorité inférieure. Si possible, augmentez dynamiquement la priorité des anciens messages pour vous assurer que les messages de faible priorité finissent par être traités.
Optimisez et réduisez 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.
Si vous utilisez une file d’attente unique, optimisez les coûts en mettant à l’échelle le nombre de consommateurs. Les messages à priorité élevée traitent d’abord, mais éventuellement plus lentement, tandis que les messages de priorité inférieure peuvent rencontrer des retards plus longs.
Protégez les processeurs contre les pics de demande. Si le taux d’arrivée du producteur peut dépasser la capacité de traitement des consommateurs, associez ce modèle au modèle de régulation de charge basée sur une file d’attente. Cette approche met en mémoire tampon les rafales de trafic et empêche le traitement en aval des ressources de surcharger.
Recommandations de files d’attente multiples
Surveillez les vitesses de traitement. Pour vous assurer que les messages sont traités à des taux attendus, surveillez en permanence la vitesse de traitement des files d’attente à priorité élevée et basse.
Mettez en œuvre la préemption et la suspension. Si vous utilisez plusieurs files d’attente avec un pool de consommateurs unique, implémentez un algorithme qui garantit que les files d’attente de priorité élevée sont toujours serviceées avant les files d’attente de priorité inférieure.
Considérez les coûts des files d’attente. Tenez compte des coûts financiers associés à la vérification et au traitement des files d’attente. Certains services de file d’attente facturent des frais pour la publication, la récupération et l’interrogation de messages. Ces frais peuvent augmenter avec le nombre de files d’attente.
Quand utiliser ce modèle
Utilisez ce modèle dans les situations suivantes :
Vous devez atteindre des objectifs de latence ou de niveau de service différents pour différentes classes de travail, telles que premium et les demandes client standard.
Le travail arrive en rafales et vous devez protéger les opérations critiques en traitant d’abord les messages à priorité élevée tout en reportant le travail de priorité inférieure.
Ce modèle peut ne pas convenir lorsque :
Tous les éléments de travail ont une importance commerciale similaire, et le traitement FIFO strict est plus important que la planification basée sur les priorités.
Les tâches ont des dépendances de classement fortes entre les niveaux de priorité et la réorganisation du travail par priorité peut entraîner des résultats incohérents ou nécessiter une logique de coordination complexe.
Conception de la charge de travail
Évaluez comment utiliser le modèle file d'attente prioritaire dans la conception d'une charge de travail pour répondre aux objectifs et principes abordés dans les piliers de l'infrastructure Azure Well-Architected. Le tableau suivant fournit des conseils sur la façon dont ce modèle prend en charge les objectifs de chaque pilier.
| 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 |
| L’efficacité des performances permet à votre charge de travail de répondre efficacement aux demandes par le biais d’optimisations de la mise à l’échelle, des données et 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 |
Si ce modèle introduit des compromis au sein d’un pilier, considérez-les contre les objectifs des autres piliers.
Exemple
L’exemple de modèle File d’attente prioritaire sur GitHub illustre une implémentation du modèle File d’attente prioritaire qui utilise Azure Service Bus rubriques et abonnements. L’exemple déploie un compte de stockage sécurisé, une ressource Application Insights pour la surveillance et un espace de noms Service Bus pour permettre la communication entre les fonctions de l’expéditeur et du consommateur.
Le déploiement comprend trois applications de fonction : un expéditeur et deux consommateurs. Les applications grand public utilisent différents nombres d’instances maximales pour simuler la hiérarchisation des messages. La funcPriorityQueueConsumerHigh fonction peut effectuer un scale-out vers 200 instances, tandis que la funcPriorityQueueConsumerLow fonction est limitée à 40 instances. Toutes les applications de fonction utilisent le plan de consommation Flex et sont connectées à Application Insights pour les diagnostics et la surveillance.
Les attributions de rôles accordent un accès sécurisé aux Service Bus et au stockage à l’aide d’identités managées. Toutes les applications de fonction partagent le même compte de stockage et la même ressource Application Insights. Cette configuration centralise l’observabilité et la journalisation.
Le diagramme suivant illustre l’architecture de file d’attente prioritaire :
Dans le diagramme ci-dessus :
Application (producteur). L’application
PriorityQueueSendercrée des messages, affecte une propriété d’application personnalisée appeléePriorityà chaque message et définit laPriorityvaleur surHighouLow.Répartiteur de messages et rubrique. Le répartiteur de messages Service Bus envoie des messages à une rubrique Service Bus unique nommée
messages. Service Bus utilise des filtres SQL pour router chaque message vers l’abonnement de priorité élevée ou de faible priorité, en fonction de saPriorityvaleur.Plusieurs pools de consommateurs. Les
PriorityQueueConsumerHighpools de consommateurs etPriorityQueueConsumerLowles pools répondent aux messages provenant des abonnements à priorité élevée ou basse priorité à l’aide de déclencheurs Azure Functions Service Bus.
| Rôle dans l’exemple | service Azure dans l’exemple | Nom dans l’exemple |
|---|---|---|
| Application (producteur) | l'application Azure Functions | PriorityQueueExpéditeur |
| Répartiteur de messages | Azure Service Bus (Bus de service Azure) | <votre espace de noms Service Bus> |
| Rubrique de message | rubrique Azure Service Bus | messages |
| Abonnements aux messages | abonnements Azure Service Bus | highPrioritylowPriority |
| Consommateurs | l'application Azure Functions |
PriorityQueueConsumerHigh PriorityQueueConsumerLow |
Étapes suivantes
- Service Bus files d’attente, rubriques et abonnements : passez en revue les entités Service Bus et les différences entre les files d’attente et les rubriques.
- Détection dupliquée : découvrez comment Service Bus peut rejeter les messages en double lorsqu’un expéditeur effectue une nouvelle tentative après un envoi incertain.
- Files d'attente de lettres mortes : découvrez comment Service Bus déplace les messages qui ne peuvent pas être traités vers une file d'attente de lettres mortes pour l'examen ou le retraitement.
- Qu’est-ce que Stockage File d'attente Azure ?: passez en revue les concepts fondamentaux de Stockage File d'attente Azure pour le comparer aux files d’attente Service Bus.
Ressources associées
Les modèles suivants peuvent être utiles lorsque vous implémentez ce modèle :
Queue-Based modèle de nivellement de charge : utilisez une file d’attente comme mémoire tampon entre l’entrée de demande et le traitement. Utilisez-le avec le modèle File d’attente prioritaire lorsque vous avez besoin de la protection en rafale et de la gestion différenciée.
Modèle consommateurs concurrents : implémentez plusieurs consommateurs qui écoutent les mêmes tâches de file d’attente et de processus en parallèle pour augmenter le débit. Un seul consommateur traite chaque message.
Modèle de limitation : implémentez la limitation à l’aide de files d’attente pour gérer les taux de demandes. Utilisez la messagerie prioritaire pour hiérarchiser les demandes des applications critiques ou des clients à valeur élevée par rapport à des demandes moins importantes.