Priorità di conversazione

Le priorità di conversazione sono un insieme di regole definite dall'utente, ognuna delle quali specifica un livello di priorità e il criterio che determina a quali conversazioni Service Broker deve essere assegnato il livello di priorità. I messaggi provenienti da conversazioni che hanno livelli di priorità alti sono in genere inviati o ricevuti prima dei messaggi di conversazioni che hanno livelli di priorità bassi.

Utilizzi delle priorità di conversazione

Le priorità di conversazione possono essere utilizzate per eseguire le seguenti operazioni:

  • Identificare le conversazioni che hanno precedenza su altre.

  • Supportare i diversi livelli di servizio, in cui i messaggi dei clienti che pagano tariffe più elevate sono inviati prima dei messaggi dei clienti che pagano tariffe più basse.

  • Prediligere le richieste dei clienti rispetto alle attività in background. Ad esempio, le registrazioni dei nuovi clienti devono avere una priorità più elevata rispetto all'invio dei riepiloghi delle transazioni aziendali a un data warehouse.

Priorità di conversazione ed endpoint di conversazione

Le priorità di conversazione sono create in ogni database utilizzando l'istruzione CREATE BROKER PRIORITY. Ogni priorità di conversazione definisce gli elementi seguenti:

  • Un nome per la priorità di conversazione.

  • Un livello di priorità da assegnare alle conversazioni Service Broker. I livelli sono specificati come numeri interi da 1 (più basso) a 10 (più alto). Il valore predefinito è 5.

  • I criteri che determinano a quali conversazioni il livello di priorità si applica sono i seguenti:

    • Un nome di contratto o ANY.

    • Un nome di servizio locale o ANY.

    • Un nome di servizio remoto o ANY.

Service Broker assegna i livelli di priorità agli endpoint di conversazione quando questi vengono creati. Ciascuna conversazione presenta due endpoint di conversazione:

  • L'endpoint di conversazione dell'Initiator associa un lato della conversazione al servizio Initiator e alla coda dell'Initiator. L'endpoint di conversazione dell'Initiator viene creato quando l'istruzione BEGIN DIALOG viene eseguita. Le operazioni associate all'endpoint di conversazione dell'Initiator includono gli elementi seguenti:

    • Invio dal servizio Initiator.

    • Ricezione dalla coda dell'Initiator.

    • Recupero del successivo gruppo di conversazioni dalla coda dell'Initiator.

  • L'endpoint di conversazione di destinazione associa l'altro lato della conversazione al servizio e alla coda di destinazione. L'endpoint di conversazione di destinazione viene creato quando il primo messaggio dall'Initiator viene inserito nella coda di destinazione. Le operazioni associate all'endpoint di conversazione di destinazione includono gli elementi seguenti:

    • Ricezione dalla coda di destinazione.

    • Invio dal servizio di destinazione.

    • Recupero del successivo gruppo di conversazioni dalla coda di destinazione.

In base all'endpoint di conversazione viene stabilito se si tratta di un servizio locale oppure remoto:

  • Per l'endpoint di conversazione dell'Initiator, il servizio Initiator è il servizio locale, mentre il servizio di destinazione è rappresentato dal servizio remoto.

  • Per l'endpoint di conversazione di destinazione, il servizio di destinazione è il servizio locale, mentre il servizio dell'Initiator è il servizio remoto.

Modalità di assegnazione dei livelli di priorità da parte del servizio Service Broker

Service Broker assegna i livelli di priorità di conversazione quando vengono creati gli endpoint di conversazione. L'endpoint di conversazione conserva il livello di priorità fino alla fine della conversazione. Le nuove priorità o le modifiche alle priorità esistenti non sono applicate alle conversazioni esistenti.

Service Broker assegna il livello di priorità all'endpoint di conversazione in base alle priorità di conversazione con criteri di contratto e servizi maggiormente corrispondenti alle proprietà dell'endpoint. Nella tabella seguente viene indicata la precedenza tra le corrispondenze:

Contratto di endpoint

Servizio locale di endpoint

Servizio remoto di endpoint

Contratto prioritario

Servizio locale prioritario

Servizio remoto prioritario

Contratto prioritario

Servizio locale prioritario

ANY

Contratto prioritario

ANY

Servizio remoto prioritario

Contratto prioritario

ANY

ANY

ANY

Servizio locale prioritario

Servizio remoto prioritario

ANY

Servizio locale prioritario

ANY

ANY

ANY

Servizio remoto prioritario

ANY

ANY

ANY

Service Broker cerca in primo luogo una priorità per cui siano stati specificati contratto, servizio locale e servizio remoto con priorità corrispondenti a quelle utilizzate dall'endpoint di conversazione. Se non viene trovata, Service Broker cerca una priorità con un contratto e un servizio locale che corrisponda alle priorità utilizzate dall'endpoint e per cui il servizio remoto sia stato specificato come ANY. Si procede quindi in questo modo per tutte le variazioni elencate nella tabella delle precedenze. Se non viene trovata alcuna corrispondenza, all'endpoint viene assegnata la priorità predefinita di 5.

I protocolli di comunicazione Service Broker non trasmettono i livelli di priorità tra gli endpoint di conversazione. Service Broker assegna indipendentemente un livello di priorità a ciascun endpoint. Affinché Service Broker assegni livelli di priorità agli endpoint di conversazione sia dell'Initiator che di destinazione, è necessario verificare che per entrambi gli endpoint siano state specificate priorità di conversazione. Se gli endpoint di conversazione dell'Initiator e di destinazione sono in database separati, è necessario creare le priorità di conversazione in ogni database. Se gli endpoint dell'Initiator e di destinazione sono nello stesso database:

  • È possibile includere entrambi gli endpoint di conversazione utilizzando una priorità di conversazione che specifichi il nome del contratto utilizzato dalla conversazione e ANY per il nome del servizio locale e remoto.

  • È possibile includere ciascun endpoint in modo separato, utilizzando due priorità di conversazione:

    • Una conversazione per l'endpoint dell'Initiator che specifichi il nome del servizio dell'Initiator per LOCAL_SERVICE_NAME e il nome del servizio di destinazione per REMOTE_SERVICE_NAME.

    • Una conversazione per l'endpoint di destinazione che specifichi il nome del servizio di destinazione per LOCAL_SERVICE_NAME e il nome del servizio dell'Initiator per REMOTE_SERVICE_NAME.

Lo stesso livello di priorità è specificato generalmente per entrambi gli endpoint di conversazione per una conversazione. Anche se è possibile specificare diversi livelli di priorità per ciascun endpoint, questo non significa che i messaggi vengono inviati più velocemente in una direzione rispetto all'altra. I messaggi vengono inviati da un endpoint di conversazione e ricevuti dall'altro endpoint. Pertanto, ogni trasmissione di messaggio è influenzata dai livelli di priorità assegnati a entrambi gli endpoint. Ad esempio, è possibile configurare una conversazione in modo che l'endpoint di conversazione dell'Initiator abbia come livello di priorità 10 e l'endpoint di destinazione abbia come livello di priorità 1. In questo caso:

  • I messaggi trasmessi dal servizio Initiator con il livello di priorità 10 vengono ricevuti dalla coda di destinazione utilizzando il livello di priorità 1.

  • I messaggi trasmessi dal servizio di destinazione con il livello di priorità 1 sono ricevuti dalla coda dell'Initiator utilizzando il livello di priorità 10.

A un gruppo di conversazioni viene assegnato lo stesso livello di priorità più elevato assegnato a tutte le conversazioni per cui sono valide le seguenti condizioni:

  • La conversazione è un membro del gruppo.

  • La conversazione presenta attualmente messaggi nella coda di servizio.

A tutti gli endpoint di conversazione in un database viene assegnata la stessa priorità predefinita di 5 se non è stata creata alcuna priorità di conversazione nel database.

Le priorità di conversazione non influiscono sull'inoltro dei messaggi che viene eseguito sempre con il livello di priorità predefinito di 5.

Esempio di priorità di conversazione

Considerare un sistema con i seguenti elementi:

  • Un InitiatorDB che contiene un InitiatorService e InitiatorQueue.

  • Un TargetDB che contiene un TargetService e TargetQueue.

  • Un contratto denominato SimpleContractche specifica che RequestMessages siano inviate da InitiatorService a TargetService. Specifica inoltre che i ReplyMessages siano inviati da TargetService a InitiatorService.

Questo script specifica il livello di priorità per l'endpoint di conversazione dell'Initiator e le operazioni associate:

  • SEND di RequestMessage da InitiatorService a TargetQueue.

  • RECEIVE di ReplyMessage da InitiatorQueue.

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

Questo script specifica il livello di priorità per l'endpoint di conversazione di destinazione e le operazioni associate:

  • RECEIVE di RequestMessage da TargetQueue.

  • SEND di ReplyMessage da TargetService a 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

Modalità di funzionamento delle priorità

In genere, Service Broker invia e riceve i messaggi per le conversazioni con priorità alta prima di inviare e ricevere i messaggi per le conversazioni con priorità bassa. I messaggi delle conversazioni con priorità alta restano meno tempo nelle code rispetto ai messaggi delle conversazioni con priorità bassa.

Livelli di priorità per la ricezione

I livelli di priorità sono applicati sempre a operazioni che ricevono messaggi o identificatori di gruppi di conversazioni da una coda.

Il livello di priorità è uno dei fattori che determina l'insieme dei messaggi recuperati da RECEIVE e la sequenza con la quale i messaggi vengono recuperati:

  • Ogni istruzione RECEIVE recupera sempre i messaggi da un gruppo di conversazioni:

    • Un'istruzione RECEIVE che non presenta la clausola WHERE recupera i messaggi che appartengono al gruppo di conversazioni sbloccato con la massima priorità che presenta messaggi nella coda.

    • Un'istruzione RECEIVE che presenta una clausola WHERE recupera i messaggi per il gruppo di conversazioni specificato nella clausola WHERE.

  • All'interno di un gruppo di conversazioni, RECEIVE recupera i messaggi a seconda del livello di priorità delle conversazioni nel gruppo. Vengono recuperati in primo luogo tutti i messaggi della conversazione con il livello di priorità più elevato, quindi i messaggi per la conversazione con il livello di priorità successivo e così via.

  • All'interno di una conversazione, i messaggi vengono recuperati nella sequenza in cui vengono inviati.

GET CONVERSATION GROUP restituisce il gruppo con il livello di priorità più elevato dall'insieme dei gruppi sbloccati che presentano messaggi nella coda.

Livelli di priorità della trasmissione

I messaggi nelle code di trasmissione per un'istanza sono trasmessi in sequenza in base a:

  • Livello di priorità dell'endpoint di conversazione associato.

  • All'interno del livello di priorità, la sequenza di invio nella conversazione.

Service Broker coordina i livelli di priorità per tutte le code di trasmissione in un'istanza del motore di database, trasmettendo in primo luogo i messaggi dalle conversazioni con priorità 10 in tutte le code di trasmissione, quindi i messaggi dalle conversazioni con priorità 9 e così via.

La differenza relativa delle prestazioni dei messaggi aumenta in base alla differenza dei livelli di priorità. In un sistema che utilizza due livelli di priorità adiacenti, ad esempio 9 e 10, i messaggi con il livello di priorità più elevato avranno un piccolo vantaggio in termini di prestazioni. In un sistema che utilizza due livelli di priorità molto diversi, ad esempio 1 e 10, i messaggi con il livello di priorità più elevato avranno un maggiore vantaggio in termini di prestazioni. Nei sistemi che utilizzano diversi livelli di priorità, la maggior parte dell'elaborazione viene allocata ai livelli di priorità 2 o 3.

I livelli di priorità specificati nelle priorità di conversazione sono applicati esclusivamente ai messaggi nella coda di trasmissione se l'opzione del database HONOR_BROKER_PRIORITY è impostata su ON. Se HONOR_BROKER_PRIORITY è impostata su OFF, tutti i messaggi inseriti nella coda di trasmissione per tale database sono inviati utilizzando il livello di priorità predefinito di 5. Se viene visualizzato utilizzando sys.transmission_queue, il messaggio visualizza il livello di priorità che riceve dall'endpoint, ma per trasmettere il messaggio viene utilizzato il livello di priorità predefinito.

Dal momento che i livelli di priorità sono applicati ai messaggi nella coda di trasmissione, generalmente non influiscono sui messaggi inviati tra i servizi nella stessa istanza del motore di database. I messaggi che sono inviati a un servizio nella stessa istanza sono posizionati direttamente nella coda del servizio senza passare per la coda di trasmissione. Alcune condizioni potrebbero produrre l'inserimento dei messaggi locali nella coda di trasmissione, ad esempio alcuni tipi di errori o una condizione di inattività della coda di destinazione. Se il messaggio viene archiviato nella coda di trasmissione, viene applicato il relativo livello di priorità.

I messaggi e i frammenti di messaggi possono essere inviati senza ordine di priorità:

  • Service Broker invia i messaggi tra le istanze del motore di database utilizzando blocchi di frammenti di messaggi. Se sono presenti molti frammenti di messaggi con priorità diverse pronti da inviare a un'istanza, Service Broker potrebbe inviare tutti i frammenti in un blocco. Alcuni frammenti alla fine del blocco potrebbero avere un livello di priorità inferiore rispetto ai frammenti di messaggi in attesa della trasmissione a un'altra istanza.

  • Service Broker comprende un meccanismo per impedire l'arresto del processo di elaborazione che fa in modo che i messaggi con priorità bassa non vengano bloccati in presenza di un numero elevato di messaggi con priorità alta. Un messaggio con priorità bassa in attesa da molto tempo può essere inviato anche se nella coda sono presenti messaggi con priorità più alta.

Sebbene messaggi singoli o frammenti di messaggi possano essere inviati senza ordine di priorità, gli effetti totali saranno irrilevanti se considerati a fronte dei numerosi messaggi inviati.