Mönster för prioritetskö

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.

Diagram som illustrerar en kömekanism som stöder meddelandeprioritering.

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.

Diagram som visar hur du använder en enskild konsumentpool för alla prioriteringar.

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.

Diagram som visar hur du använder separata konsumentpooler för varje 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:

Diagram som visar hur du implementerar en prioritetskö med hjälp av Service Bus.

I diagrammet ovan händer följande:

  1. Applikation (producent). Programmet PriorityQueueSender skapar meddelanden, tilldelar en anpassad programegenskap som anropas Priority till varje meddelande och anger Priority värdet till High eller Low.

  2. 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å dess Priority värde.

  3. Flera konsumentpooler. Konsumentpoolerna PriorityQueueConsumerHigh och PriorityQueueConsumerLow svarar 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 highPriority
lowPriority
Konsumenter Azure Functions-applikation PriorityQueueConsumerHigh
PriorityQueueConsumerLow

Nästa steg

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.