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.
gäller för:SQL Server
Azure SQL Managed Instance
Aktiveringsprocessen för Service Broker består av två steg. Först avgör Service Broker om aktivering är nödvändig. För det andra avgör Service Broker om aktivering sker. Även om den exakta processen skiljer sig åt för intern aktivering och extern aktivering är de övergripande begreppen desamma för någon av strategierna.
Avgöra om aktivering är nödvändig
Aktivering krävs när en ny köläsare har en användbar uppgift att utföra. Köövervakare avgör om aktivering krävs. Service Broker skapar en köövervakare för varje kö med aktivering STATUS = ON eller för vilken ett QUEUE_ACTIVATION händelsemeddelande har registrerats. Den dynamiska hanteringsvyn sys.dm_broker_queue_monitors visar en lista över de köövervakare som är aktiva i instansen.
Varje köövervakare spårar följande kriterier:
- Om kön innehåller meddelanden som är redo för mottagning
- Hur nyligen returnerade ett
RECEIVE-uttalande om kön en tom resultatuppsättning - Hur många lagrade procedurer för aktivering körs för närvarande för kön
En köövervakare kontrollerar om aktivering är nödvändig med några sekunders mellanrum och när en eller flera av följande händelser inträffar:
- Ett nytt meddelande tas emot i kön
- SQL Server exekverar ett
RECEIVEkommando för kön - En transaktion som innehåller en
RECEIVEinstruktion rullas tillbaka - Alla lagrade procedurer som har startats av köövervakaren avslutas
- SQL Server kör en
ALTERinstruktion för kön
Aktivering är nödvändig om något av följande villkor är sant:
Ett nytt meddelande kommer till en kö som inte innehåller några olästa meddelanden och det finns inga aktiverings lagrade procedurer som körs för kön.
Kön innehåller olästa meddelanden, det finns ingen session som väntar i en
GET CONVERSATION GROUPinstruktion eller enRECEIVEinstruktion utan enWHEREsats, och ingenGET CONVERSATION GROUPinstruktion ellerRECEIVEinstruktion utan enWHEREsats har returnerat en tom resultatuppsättning under några sekunder. Med andra ord, när meddelanden ackumuleras i kön eftersom de aktiverade procedurerna inte kan läsa dem tillräckligt snabbt.
I själva verket gör den här proceduren att köövervakaren kan avgöra om antalet köläsare som bearbetar kön håller jämna steg med den inkommande meddelandetrafiken. Den här metoden tar hänsyn till låsning av konversationsgrupper. Eftersom endast en köläsare i taget kan bearbeta meddelanden för en konversation kan det slösa resurser på att starta köläsare som svar på en enklare metod, till exempel antalet olästa meddelanden i kön. I stället tar Service Broker-aktiveringen hänsyn till om en ny köläsare har ett användbart arbete att utföra.
En kö kan till exempel innehålla ett stort antal obearbetade meddelanden i en enda konversation. I detta fall kan endast en kököare bearbeta meddelandena. Köövervakaren aktiverar en annan köläsare. Den andra köläsaren väntar i instruktionen RECEIVE eftersom alla meddelanden tillhör ett enda samtal. Så länge alla meddelanden i kön tillhör samma konversation och den andra köläsaren fortfarande körs, startar inte köövervakaren någon annan köläsare.
Avgöra om aktivering sker
När Service Broker har fastställt att aktivering är nödvändig måste Service Broker bestämma om aktivering ska ske.
För intern aktivering aktiverar köövervakaren en ny instans av den lagrade aktiveringsproceduren när antalet program som körs är lägre än det MAX_QUEUE_READERS värde som angetts för kön. Om antalet program som körs är lika med eller större än MAX_QUEUE_READERS värdet startar inte köövervakaren en ny instans av den lagrade proceduren. Hanteringsvyn sys.dm_broker_activated_tasks innehåller information om lagrade procedurer som startats av Service Broker.
För externa program har Service Broker ingen information om antalet distinkta köläsare som kanske arbetar med kön. Dessutom kan det krävas en viss starttid mellan den tid då aktiveringshändelsen aktiveras och den tid då en läsare börjar läsa kön. Därför ger Service Broker en tidsgräns för att ett externt program ska svara. Under timeouten producerar Service Broker inte något ytterligare meddelande. När ett program anropar RECEIVE i kön eller tidsgränsen upphör att gälla skapar Service Broker ytterligare ett händelsemeddelande om aktivering krävs. Ett externt program övervakar händelsenotifieringarna medan programmet körs för att avgöra om fler köhanterare krävs för att bearbeta händelser.