Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert 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. Le fait de ne pas traiter les tâches hautement prioritaires peut affecter l’expérience utilisateur et entraîner une violation des SLA.
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. Ajustez la taille des groupes de consommateurs en fonction de la longueur de la file d’attente qu’ils traitent.
Surveillez l’état 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.
Utilisation des files d'attente de lettres mortes Déplacez les messages poison vers une file de lettres mortes après un nombre configurable de tentatives de livraison, afin qu’un seul message défaillant ne bloque pas le flux prioritaire.
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 réduisant 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 absorbe les pics de trafic et aide à éviter la surcharge des ressources de traitement en aval.
Recommandations pour plusieurs files d’attente
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 l’envoi, 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 groupes de consommateurs
PriorityQueueConsumerHighetPriorityQueueConsumerLowrépondent aux messages provenant des abonnements à haute priorité ou à basse priorité à l’aide de déclencheurs Service Bus d’Azure Functions.
| Rôle dans l’exemple | service Azure dans l’exemple | Nom dans l’exemple |
|---|---|---|
| Application (producteur) | l'application Azure Functions | PriorityQueueSender |
| 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
- Files d’attente, rubriques et abonnements de Service Bus : examinez les entités de 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 :
Modèle de lissage de charge basé sur une file d’attente : utilisez une file d’attente comme mémoire tampon entre la réception des demandes et leur traitement. Utilisez-le avec le modèle de file d’attente prioritaire lorsque vous avez besoin à la fois d’une protection contre les pics de trafic et d’un traitement différencié.
Modèle de consommateurs concurrents : Implémenter plusieurs consommateurs qui écoutent la même file d’attente et traitent les tâches en parallèle afin d’augmenter le débit. Un seul consommateur traite chaque message.
Modèle de limitation du débit : implémentez la limitation du débit à l’aide de files d’attente pour gérer le débit des requêtes. Utilisez la messagerie prioritaire pour hiérarchiser les demandes des applications critiques ou des clients à valeur élevée par rapport à des demandes moins importantes.