Konversationsprioriteringar

gäller för:SQL ServerAzure SQL Managed Instance

Konversationsprioriteringar är en uppsättning användardefinierade regler, som var och en anger en prioritetsnivå och kriterierna för att avgöra vilka Service Broker-konversationer som ska tilldela prioritetsnivån. Meddelanden från konversationer med hög prioritet skickas eller tas vanligtvis emot före meddelanden från konversationer med låg prioritet.

Användning av konversationsprioriteringar

Konversationsprioriteringar kan användas för att göra följande:

  • Identifiera konversationer som har företräde framför andra.

  • Stöd för olika tjänstnivåer, där meddelanden från kunder som betalar högre priser skickas före meddelanden från kunder som betalar lägre priser.

  • Gynna kundförfrågningar framför bakgrundsaktiviteter. Till exempel bör nya kundregistreringar ha högre prioritet än att skicka sammanfattningar av affärstransaktioner till ett informationslager.

Konversationsprioriteringar och konverteringsslutpunkter

Konversationsprioriteringar skapas i varje databas med hjälp av -instruktionen CREATE BROKER PRIORITY . Varje konversationsprioritet definierar följande:

  • Ett namn för konversationsprioriteten.

  • En prioritetsnivå för att tilldela Service Broker-konversationer. Nivåerna anges som heltal från 1 (lägsta) till 10 (högsta). Standardvärdet är 5.

  • De kriterier som avgör vilka konversationer prioritetsnivån gäller för följande:

    • Ett kontraktnamn, eller ANY
    • Ett lokalt tjänstnamn, eller ANY
    • Ett fjärrtjänstnamn, eller ANY

Service Broker tilldelar prioritetsnivåerna till konversationsslutpunkter när slutpunkterna skapas. Varje konversation har två konversationsslutpunkter:

  • Initierarens konversationsslutpunkt associerar ena sidan av konversationen med initierartjänsten och initierarkön. Konversationsslutpunkten för initieraren skapas när -instruktionen BEGIN DIALOG körs. De åtgärder som är associerade med konversationsslutpunkten för initieraren omfattar följande:

    • Skickar från initierartjänsten
    • Tar emot från initierarkön
    • Hämta nästa konversationsgrupp från initierarkön
  • Slutpunkten för målkonversation associerar den andra sidan av konversationen med måltjänsten och kön. Slutpunkten för målkonversation skapas när det första meddelandet från initieraren placeras i målkön. De åtgärder som är associerade med slutpunkten för målkonversationen innehåller följande:

    • Tar emot från målkön
    • Skickar från måltjänsten
    • Hämta nästa konversationsgrupp från målkön

Vilken tjänst som utvärderas som en lokal tjänst eller fjärrtjänst beror på typen av konversationsslutpunkt:

  • För initierarens konversationsslutpunkt är initierartjänsten den lokala tjänsten och måltjänsten är fjärrtjänsten.
  • För målkonversationens slutpunkt är måltjänsten den lokala tjänsten och initierartjänsten är fjärrtjänsten.

Så här tilldelar Service Broker prioritetsnivåer

Service Broker tilldelar konversationsprioritetsnivåer när konversationsslutpunkter skapas. Konversationsslutpunkten behåller prioritetsnivån tills konversationen avslutas. Nya prioriteringar eller ändringar av befintliga prioriteringar tillämpas inte på befintliga konversationer.

Service Broker tilldelar konversationsslutpunkten prioritetsnivån från konversationsprioriteten vars kontrakt- och tjänstvillkor bäst matchar slutpunktsegenskaperna. I följande tabell visas matchningspriorensen:

Slutpunktskontrakt Lokal slutpunktstjänst Fjärrtjänst för slutpunkt
Prioritetskontrakt Lokal prioritetstjänst Fjärrtjänst för prioritet
Prioritetskontrakt Lokal prioritetstjänst ANY
Prioritetskontrakt ANY Fjärrtjänst för prioritet
Prioritetskontrakt ANY ANY
ANY Lokal prioritetstjänst Fjärrtjänst för prioritet
ANY Lokal prioritetstjänst ANY
ANY ANY Fjärrtjänst för prioritet
ANY ANY ANY

Service Broker söker först efter en prioritet vars angivna kontrakt, lokala tjänst och fjärrtjänst matchar de som används av konversationsslutpunkten. Om en inte hittas söker Service Broker efter en prioritet med ett kontrakt och en lokal tjänst som matchar dem som används av slutpunkten och där fjärrtjänsten angavs som ANY. Detta fortsätter för alla varianter som anges i prioritetstabellen. Om ingen matchning hittas tilldelas slutpunkten standardprioriteten 5.

Kommunikationsprotokollen för Service Broker överför inte prioritetsnivåer mellan konversationsslutpunkter. Service Broker tilldelar oberoende en prioritetsnivå till varje slutpunkt. Om du vill att Service Broker ska tilldela prioritetsnivåer till både initieraren och målkonversationens slutpunkter måste du se till att båda slutpunkterna omfattas av konversationsprioriteringar. Om initieraren och målkonversationens slutpunkter finns i separata databaser måste du skapa konversationsprioriteringar i varje databas. Om initieraren och målslutpunkterna finns i samma databas:

  • Du kan täcka båda konversationsslutpunkterna med hjälp av en konversationsprioritet som anger kontraktnamnet som används av konversationen och ANY för både lokala och fjärranslutna tjänstnamn.

  • Du kan täcka varje konversationsslutpunkt separat med hjälp av två konversationsprioriteringar:

    • En konversation för initierarens slutpunkt som anger initierarens tjänstnamn för LOCAL_SERVICE_NAME och måltjänstnamnet för REMOTE_SERVICE_NAME.

    • En konversation för målslutpunkten som anger måltjänstens namn för LOCAL_SERVICE_NAME och namnet på initierarens tjänst för REMOTE_SERVICE_NAME.

Samma prioritetsnivå anges vanligtvis för båda konversationsslutpunkterna för en konversation. Även om du kan ange olika prioritetsnivåer för varje slutpunkt betyder det inte att meddelanden skickas snabbare i en riktning än den andra. Meddelanden skickas från en konversationsslutpunkt och tas emot på den andra slutpunkten. Därför påverkas varje meddelandeöverföring av de prioritetsnivåer som tilldelats båda slutpunkterna. Du kan till exempel konfigurera en konversation så att initierarens konversationsslutpunkt har prioritetsnivå 10 och målslutpunkten har prioritetsnivå 1. I det här fallet:

  • Meddelanden som skickas från initierartjänsten med hjälp av prioritetsnivå 10 tas emot från målkön med prioritetsnivå 1.

  • Meddelanden som skickas från måltjänsten med hjälp av prioritetsnivå 1 tas emot från initierarkön med prioritetsnivå 10.

En konversationsgrupp tilldelas samma prioritetsnivå som den högsta prioritetsnivå som tilldelats alla konversationer där följande är sant:

  • Konversationen är medlem i gruppen.
  • Konversationen har för närvarande meddelanden i tjänstkön.

Alla konversationsslutpunkter i en databas tilldelas standardprioriteter på 5 om inga konversationsprioriteringar har skapats i databasen.

Konversationsprioriteringar påverkar inte vidarebefordran av meddelanden, som alltid fungerar på standardprioritetsnivån 5.

Exempel på konversationsprioritet

Överväg ett system med följande:

  • En InitiatorDB som innehåller en InitiatorService och InitiatorQueue.

  • A TargetDB som innehåller en TargetService och TargetQueue.

  • Ett kontrakt med namnet SimpleContract, som anger vilka som RequestMessages skickas från InitiatorService till TargetService. Den anger också som ReplyMessages skickas från TargetService till InitiatorService.

Det här skriptet anger prioritetsnivån för initierarens konversationsslutpunkt och dess associerade åtgärder:

  • Från SENDRequestMessage från InitiatorService till TargetQueue
  • RECEIVE Från ReplyMessageInitiatorQueue
USE InitiatorDB;
GO

CREATE BROKER PRIORITY InitiatorToTargetPriority FOR CONVERSATION
    SET
    (
            CONTRACT_NAME = SimpleContract,
            LOCAL_SERVICE_NAME = InitiatorService,
            REMOTE_SERVICE_NAME = N'TargetService',
            PRIORITY_LEVEL = 3
    );
GO

Det här skriptet anger prioritetsnivån för målkonversationens slutpunkt och dess associerade åtgärder:

  • RECEIVE Från RequestMessageTargetQueue
  • Från SENDReplyMessage från TargetService till InitiatorQueue
USE TargetDB;
GO

CREATE BROKER PRIORITY TargetToInitiatorPriority FOR CONVERSATION
    SET
    (
            CONTRACT_NAME = SimpleContract,
            LOCAL_SERVICE_NAME = TargetService,
            REMOTE_SERVICE_NAME = N'InitiatorService',
            PRIORITY_LEVEL = 3
    );
GO

Hur prioriteringar fungerar

Vanligtvis skickar och tar Service Broker emot meddelanden för konversationer med hög prioritet innan du skickar och tar emot meddelanden för konversationer med låg prioritet. Meddelanden från konversationer med hög prioritet tillbringar mindre tid i köer än meddelanden från konversationer med låg prioritet.

Prioritetsnivåer för mottagning

Prioritetsnivåer tillämpas alltid på åtgärder som tar emot meddelanden eller konversationsgruppidentifierare från en kö.

Prioritetsnivå är en av de faktorer som avgör vilken uppsättning meddelanden som hämtas av en RECEIVE och i vilken ordning meddelandena hämtas:

  • Varje RECEIVE instruktion hämtar alltid meddelanden från en konversationsgrupp:

    • En RECEIVE som inte har någon WHERE sats hämtar meddelanden som tillhör den upplåst konversationsgrupp med högst prioritet som har meddelanden i kön.

    • En RECEIVE som har en WHERE -sats hämtar meddelandena för konversationsgruppen som anges i WHERE -satsen.

  • I en konversationsgrupp RECEIVE hämtar meddelanden beroende på prioritetsnivån för konversationerna i gruppen. Alla meddelanden från konversationen med den högsta prioritetsnivån hämtas först, sedan meddelandena för konversationen med den näst högsta prioritetsnivån och så vidare.

  • I en konversation hämtas meddelandena i samma sekvens som de skickades.

GET CONVERSATION GROUP returnerar gruppen med den högsta prioritetsnivån från uppsättningen olåst grupper som har meddelanden i kön.

Överföringsprioritetsnivåer

Meddelanden i överföringsköerna för en instans överförs i sekvens baserat på:

  • Prioritetsnivån för deras associerade konversationsslutpunkt.
  • Inom prioritetsnivå skickas sekvensen i konversationen.

Service Broker samordnar prioritetsnivåer i alla överföringsköer i en instans av databasmotorn. Service Broker överför först meddelanden från prioritet 10-konversationer i alla överföringsköer, sedan meddelanden från prioritet 9-konversationer och så vidare.

Den relativa skillnaden i meddelandeprestanda ökar med skillnaden i prioritetsnivåer. I ett system som använder två intilliggande prioritetsnivåer, till exempel 9 och 10, har meddelandena med högre prioritetsnivå en liten prestandafördel. I ett system som använder två vitt skilda prioritetsnivåer, till exempel 1 och 10, har meddelanden med högre prioritet en större prestandafördel. I system som använder flera prioritetsnivåer allokeras merparten av bearbetningen till de översta 2 eller 3 prioritetsnivåerna.

Prioritetsnivåer som anges i konversationsprioriteringar tillämpas endast på meddelanden i överföringskö om databasalternativet HONOR_BROKER_PRIORITY är inställt på ON. Om HONOR_BROKER_PRIORITY är inställt på OFFskickas alla meddelanden som placeras i överföringskö för databasen med standardprioritetsnivån 5. När det visas med visar sys.transmission_queuemeddelandet fortfarande den prioritetsnivå som det tog emot från slutpunkten, men standardprioritetsnivån används för att överföra meddelandet.

Eftersom prioritetsnivåer tillämpas på meddelanden i överföringskö påverkar de vanligtvis inte meddelanden som skickas mellan tjänster i samma instans av databasmotorn. Meddelanden som skickas till en tjänst i samma instans placeras direkt i tjänstens kö utan att gå igenom en överföringskö. Vissa villkor kan göra att lokala meddelanden placeras i överföringskö, till exempel vissa typer av fel eller att målkön är inaktiv. Om meddelandet lagras i överföringskö tillämpas den relevanta prioritetsnivån.

Meddelanden och meddelandefragment kan skickas ur prioritetsordning:

  • Service Broker skickar meddelanden mellan instanser av databasmotorn med hjälp av block med meddelandefragment. Om det finns flera meddelandefragment med olika prioriteter som är redo att skickas till en instans kan Service Broker skicka alla fragment i ett block. Vissa fragment i slutet av blocket kan ha en lägre prioritetsnivå än meddelandefragment som väntar på överföring till en annan instans.

  • Service Broker innehåller en mekanism för förebyggande av svält som hjälper till att hindra ett stort antal meddelanden med hög prioritet från att blockera meddelanden med låg prioritet. Ett meddelande med låg prioritet som har väntat länge kan skickas även om det finns meddelanden med högre prioritet i kön.

Även om enskilda meddelanden eller meddelandefragment kan skickas ur prioritetsordning, bör effekterna vara små när de beaktas i många meddelandesändningar.