Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Prioritera förfrågningar som skickas till tjänster så att arbetsbelastningen bearbetar högprioriterade förfrågningar snabbare än förfrågningar med lägre prioritet. Den här metoden använder meddelanden som skickas till en eller flera köer och är användbar för program som tillhandahåller olika servicenivåer eller serviceavtal (SLA) till olika typer av begäranden eller kunder.
Kontext och problem
Arbetsbelastningar kan behöva hantera och bearbeta uppgifter med varierande prioritet och angelägenhetsgrad. Vissa uppgifter kräver omedelbar uppmärksamhet medan andra kan vänta. Underlåtenhet att hantera högprioriterade uppgifter kan påverka användarupplevelsen och bryta mot servicenivåavtal (SLA:er).
För att kunna hantera uppgifter effektivt baserat på deras prioritet behöver arbetsbelastningar en mekanism för att bearbeta och köra uppgifter i enlighet med detta. Som standard bearbetar de flesta arbetslaster uppgifter i den ordning de anländer, med en först in, först ut-kö (FIFO). Den här metoden tar inte hänsyn till varierande uppgiftsvikt.
Lösning
Prioritetsköer gör det möjligt för arbetslaster att bearbeta uppgifter utifrån sin prioritet i stället för strikt efter den ordning de anländer. Programmet eller producenten som skickar en begäran tilldelar ett prioritetsvärde till meddelandet och konsumenterna bearbetar meddelandena efter prioritet. Mönstret Prioritetskö uppfyller följande krav:
Hanterar uppgifter med varierande angelägenhetsgrad och betydelse: Du har uppgifter med olika brådskande och viktiga nivåer och måste se till att du bearbetar mer kritiska uppgifter före mindre kritiska uppgifter.
Hanterar olika serviceavtal: Du erbjuder olika serviceavtal till olika kunder och behöver se till att kunder med hög prioritet får bättre prestanda och tillgänglighet.
Tillgodoser olika arbetsbelastningshanteringsbehov: Du har en arbetsbelastning som måste åtgärda vissa uppgifter omedelbart medan mindre brådskande uppgifter kan vänta.
Det finns två huvudsakliga metoder för att implementera mönstret Prioritetskö:
Enskild kö: Varje meddelande tilldelas ett prioritetsvärde och alla meddelanden använder samma kö.
Flera köer: Varje meddelande tilldelas ett prioritetsvärde och meddelanden med olika prioritet använder separata köer.
Enskild kö
I en enda kömetod tilldelar programmet en prioritet till varje meddelande och skickar alla meddelanden till en enda kö. Kön beställer meddelanden efter prioritet, vilket säkerställer att konsumenterna bearbetar meddelanden med högre prioritet före lägre prioritet.
Flera köer
Flera köer separerar meddelanden efter prioritet. Programmet tilldelar en prioritet till varje meddelande och dirigerar meddelandet till kön som motsvarar dess prioritet, där konsumenterna bearbetar meddelandena. En lösning med flera köer kan använda antingen en enda pool med konsumenter eller flera konsumentpooler.
Enskild konsumentpool
I en enda poolkonfiguration delar alla köer samma konsumentpool. Konsumenter bearbetar meddelanden från kön med högst prioritet först och bearbetar endast meddelanden från köer med lägre prioritet när det inte finns fler meddelanden med hög prioritet. Därför bearbetar enskilda konsumentpooler alltid meddelanden med högre prioritet före lägre prioritet. Den här konfigurationen kan leda till att meddelanden med lägre prioritet ständigt fördröjs och eventuellt aldrig bearbetas.
Använd en enskild konsumentpool av följande skäl:
Enkel hantering. Använd en enskild konsumentpool när enkel installation och underhåll är en prioritet. En enda pool minskar konfigurations- och övervakningskomplexiteten.
Enhetliga bearbetningsbehov. Använd en enskild konsumentpool när inkommande uppgifter är av liknande typ.
Flera konsumentpooler
I en miljö med flera konsumentpooler har varje kö en dedikerad konsumentpool. Köer med högre prioritet använder fler konsumenter eller högre prestandanivåer för att bearbeta meddelanden snabbare än köer med lägre prioritet.
Använd flera konsumentpooler av följande skäl:
Strikta prestandakrav. Använd flera konsumentpooler när olika uppgiftsprioriteringar har strikta prestandakrav som måste uppfyllas oberoende av varandra.
Behov av hög tillförlitlighet. Använd flera konsumentpooler för program när tillförlitlighet och felisolering är viktiga, och problem i en kö får inte påverka andra köer.
Komplexa applikationer. Använd flera konsumentpooler för komplexa program där olika uppgifter kräver olika bearbetningsegenskaper och prestandagarantier.
Problem och överväganden
Tänk på följande när du bestämmer dig för hur du implementerar det här mönstret:
Allmänna rekommendationer
Definiera prioriteringar tydligt. Upprätta distinkta och tydliga prioritetsnivåer som är relevanta för din lösning. Du kan till exempel definiera meddelanden med hög prioritet som de som kräver bearbetning inom 10 sekunder. Identifiera konsumentkraven för hantering av högprioriterade objekt och allokera nödvändiga resurser i enlighet med detta.
Justera konsumentpooler dynamiskt. Skala storleken på konsumentpooler baserat på längden på kön som de betjänar.
Övervaka köhälsa. Spåra ködjup, svarstid för bearbetning, leveransantal och dataflöde så att du kan identifiera kvarvarande uppgifter och fördröjningar innan de påverkar arbetet.
Använd dead letter-köer. Flytta poison messages till en dead-letter-kö efter ett konfigurerbart antal leveransförsök så att ett felaktigt meddelande inte blockerar det prioriterade flödet.
Prioritera tjänstnivåer. Implementera prioritetsköer för att uppfylla affärsbehov som kräver prioriterad tillgänglighet eller prestanda. Kunder med hög prioritet kan till exempel få en högre servicenivå så att de får bättre prestanda och tillgänglighet.
Överväg bearbetning med låg prioritet. Bestäm om alla objekt med hög prioritet måste bearbetas före objekt med lägre prioritet. Om möjligt ökar du prioriteten för gamla meddelanden dynamiskt för att säkerställa att meddelanden med låg prioritet så småningom bearbetas.
Optimera och minimera kostnaderna. Bearbeta kritiska uppgifter omedelbart med tillgängliga konsumenter. Schemalägg mindre kritiska bakgrundsaktiviteter under mindre upptagna tider.
Om du använder en enda kö optimerar du kostnaderna genom att skala ned antalet konsumenter. Meddelanden med hög prioritet bearbetas först men eventuellt långsammare, medan meddelanden med lägre prioritet kan drabbas av längre fördröjningar.
Skydda processorer från efterfrågetoppar. Om producentens ankomsthastighet kan överskrida konsumentens bearbetningskapacitet, kombinera det här mönstret med mönstret köbaserad belastningsutjämning. Den här metoden buffrar trafiktoppar och hjälper till att förhindra att nedströmsbearbetningsresurser överbelastas.
Rekommendationer för flera köer
Övervaka bearbetningshastigheter. För att säkerställa att meddelanden bearbetas i förväntad takt övervakar du kontinuerligt bearbetningshastigheten för köer med hög respektive låg prioritet.
Implementera preemption och suspension. Om du använder flera köer med en enda konsumentpool implementerar du en algoritm som säkerställer att köer med hög prioritet alltid betjänas före köer med lägre prioritet.
Överväg kökostnader. Tänk på de ekonomiska kostnader som är kopplade till kontroll- och bearbetningsköer. Vissa kötjänster debiterar avgifter för att skicka, hämta och fråga efter meddelanden. Dessa avgifter kan öka med antalet köer.
När du ska använda det här mönstret
Använd det här mönstret i sådana här scenarier:
Du måste uppfylla olika svarstider eller servicenivåmål för olika arbetsklasser, till exempel premium- och standardkundförfrågningar.
Arbetet kommer i omgångar, och du måste skydda kritiska processer genom att först bearbeta meddelanden med hög prioritet och skjuta upp arbetsuppgifter med lägre prioritet.
Det här mönstret kanske inte är lämpligt när:
Alla arbetsobjekt har liknande affärsvikt och strikt FIFO-bearbetning är viktigare än prioritetsbaserad schemaläggning.
Aktiviteter har starka ordningsberoenden mellan prioritetsnivåer, och omordning av arbete efter prioritet kan orsaka inkonsekventa resultat eller kräva komplex samordningslogik.
Design av arbetsbelastning
Utvärdera hur mönstret prioritetskö används i utformningen av en arbetsbelastning för att uppfylla målen och principerna som behandlas i pelarna i Azure Well-Architected Framework. Följande tabell innehåller vägledning om hur det här mönstret stöder målen för varje pelare.
| Grundpelare | Så här stöder det här mönstret pelarmål |
|---|---|
| Beslut om tillförlitlighetsdesign hjälper din arbetsbelastning att bli motståndskraftig mot fel och se till att den återställs till ett fullt fungerande tillstånd när ett fel inträffar. | Genom att separera objekt baserat på affärsprioritet kan du fokusera tillförlitlighetsarbetet på det mest kritiska arbetet. - RE:02 Kritiska flöden |
| Prestandaeffektivitet hjälper din arbetsbelastning effektivt uppfylla kraven genom optimering av skalning, data och kod. | Genom att separera objekt baserat på affärsprioritet kan du fokusera prestandaarbetet på det mest tidskänsliga arbetet. - PE:09 Kritiska flöden |
Om detta mönster inför kompromisser inom en pelare bör du överväga dem mot målen för de andra pelarna.
Example
Mönsterexemplet Prioritetskö på GitHub visar en implementering av mönstret Prioritetskö som använder Azure Service Bus ämnen och prenumerationer. Exemplet distribuerar ett säkert lagringskonto, en Application Insights-resurs för övervakning och ett Service Bus namnområde för att möjliggöra kommunikation mellan avsändaren och konsumentfunktionerna.
Driftsättningen omfattar tre funktionsappar: en sändare och två konsumenter. Konsumentapparna använder olika högsta antal instanser för att simulera meddelandeprioritering. Funktionen funcPriorityQueueConsumerHigh kan skala ut till 200 instanser, medan funcPriorityQueueConsumerLow funktionen är begränsad till 40 instanser. Alla funktionsappar använder Flex-förbrukningsplanen och är anslutna till Application Insights för diagnostik och övervakning.
Rolltilldelningar ger säker åtkomst till Service Bus och lagring med hjälp av hanterade identiteter. Alla funktionsappar delar samma lagringskonto och Application Insights-resurs. Den här konfigurationen centraliserar observerbarhet och loggning.
Följande diagram visar prioritetsköarkitekturen:
I diagrammet ovan händer följande:
Applikation (producent). Programmet
PriorityQueueSenderskapar meddelanden, tilldelar en anpassad programegenskap som anropasPrioritytill varje meddelande och angerPriorityvärdet tillHighellerLow.Meddelandebroker och ämne. Service Bus-meddelandeförmedlaren skickar meddelanden till det enda Service Bus-ämnet med namnet
messages. Service Bus använder SQL-filter för att dirigera varje meddelande till prenumerationen med hög prioritet eller låg prioritet baserat på dessPriorityvärde.Flera konsumentpooler. Konsumentpoolerna
PriorityQueueConsumerHighochPriorityQueueConsumerLowsvarar på meddelanden från prenumerationer med hög prioritet eller låg prioritet med hjälp av Azure Functions Service Bus utlösare.
| Roll i exempel | Azure tjänst i exempel | Namn i exempel |
|---|---|---|
| Applikation (producent) | Azure Functions-applikation | PriorityQueueSender |
| Meddelandeförmedlare | Azure Service Bus (Azure-tjänstbuss) | <ditt Service Bus-namnområde> |
| Meddelandeämne | Azure Service Bus-ämne | messages |
| Meddelandeprenumerationer | Azure Service Bus prenumerationer | highPrioritylowPriority |
| Konsumenter | Azure Functions-applikation |
PriorityQueueConsumerHigh PriorityQueueConsumerLow |
Nästa steg
- Service Bus-köer, ämnen och prenumerationer: Gå igenom Service Bus-entiteterna och skillnaderna mellan köer och ämnen.
- Dubblettidentifiering: Lär dig hur Service Bus kan avvisa duplicerade meddelanden när en avsändare försöker igen efter en osäker sändning.
- Köer med obeställbara meddelanden: Lär dig hur Service Bus flyttar meddelanden som inte kan bearbetas till en kö med obeställbara meddelanden för undersökning eller ombearbetning.
- Vad är Azure Queue Storage?: Granska huvudbegreppen i Azure Queue Storage för att jämföra det med Service Bus köer.
Relaterade resurser
Följande mönster kan vara användbara när du implementerar det här mönstret:
Köbaserat mönster för belastningsutjämning: Använd en kö som buffert mellan mottagning av begäranden och bearbetning. Använd den med mönstret Prioritetskö när du behöver både burst-skydd och differentierad hantering.
Mönster för konkurrerande konsumenter: Implementera flera konsumenter som lyssnar på samma kö och bearbetar uppgifter parallellt för att öka dataflödet. Endast en konsument bearbetar varje meddelande.
Strypningsmönster: Implementera strypning med hjälp av köer för att hantera frekvensen för begäranden. Använd prioriterade meddelanden för att prioritera begäranden från kritiska program eller kunder med högt värde framför mindre viktiga.