Condividi tramite


Priorità di conversazione

Si applica a:SQL ServerIstanza gestita di SQL di Azure

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

Possibilità di utilizzo delle priorità di conversazione

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

  • Identificare le conversazioni che hanno la precedenza sulle altre.

  • Supportare diversi livelli di servizio, per cui i messaggi dei clienti che pagano tariffe più elevate vengono inviati prima dei messaggi dei clienti che pagano tariffe inferiori.

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

Priorità ed endpoint di conversazione

Le priorità di conversazione vengono create in ogni database usando l'istruzione CREATE BROKER PRIORITY. Ogni priorità di conversazione definisce:

  • Il nome della priorità di conversazione.

  • Un livello di priorità da assegnare alle conversazioni di Service Broker. I livelli vengono specificati come numeri interi, da 1 (più basso) a 10 (massimo). L'impostazione predefinita è 5.

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

    • Il nome del contratto o ANY.

    • Il nome del servizio locale o ANY.

    • Il nome del 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'iniziatore includono:

    • 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 della destinazione viene creato quando il primo messaggio dell'iniziatore viene inserito nella coda di destinazione. Le operazioni associate all'endpoint di conversazione di destinazione includono:

    • Ricezione dalla coda di destinazione.

    • Invio dal servizio di destinazione.

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

Il servizio valutato come servizio locale o remoto dipende dal tipo di endpoint di conversazione:

  • Nel caso dell'endpoint di conversazione dell'iniziatore, il servizio di origine è locale e il servizio di destinazione è remoto.

  • Nel caso dell'endpoint di conversazione di destinazione, il servizio di destinazione è locale e il servizio di origine è remoto.

Modalità di assegnazione dei livelli di priorità di 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 alla priorità di conversazione con i criteri di contratto e servizi che corrispondono maggiormente alle proprietà dell'endpoint. Nella tabella seguente viene indicata la precedenza tra le corrispondenze:

Contratto endpoint

Servizio locale dell'endpoint

Servizio remoto dell'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 usate dall'endpoint di conversazione. Se non viene trovata, Service Broker cerca una priorità con un contratto e un servizio locale che corrisponda alle priorità usate dall'endpoint e per cui il servizio remoto sia stato specificato come ANY. La ricerca 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 livello 5.

I protocolli di comunicazione di Service Broker non trasmettono i livelli di priorità tra gli endpoint di conversazione. Service Broker assegna indipendentemente un livello di priorità a ogni endpoint. Per fare in modo che Service Broker assegni livelli di priorità agli endpoint di conversazione sia di avvio 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. L'endpoint dell'iniziatore e quello di destinazione si trovano nello stesso database:

  • È possibile coprire entrambi gli endpoint di conversazione usando una priorità di conversazione che specifichi il nome del contratto usato dalla conversazione e ANY per i nomi dei servizi locali e remoti.

  • Si può anche coprire ogni endpoint di conversazione separatamente usando due priorità di conversazione:

    • Una conversazione per l'endpoint dell'iniziatore che specifica il nome del servizio di origine per LOCAL_SERVICE_NAME e il nome del servizio di destinazione per REMOTE_SERVICE_NAME.

    • Una conversazione per l'endpoint di destinazione che specifica il nome del servizio di destinazione per LOCAL_SERVICE_NAME e il nome del servizio di origine per REMOTE_SERVICE_NAME.

In generale, per entrambi gli endpoint di una conversazione viene specificato lo stesso livello di priorità. Sebbene sia possibile specificare livelli di priorità diversi per ogni endpoint, ciò non significa che i messaggi vengano inviati più velocemente in una direzione rispetto all'altra. I messaggi vengono inviati da un endpoint di conversazione e ricevuti nell'altro endpoint. Di conseguenza, ogni trasmissione di messaggi è influenzata dai livelli di priorità assegnati a entrambi gli endpoint. Ad esempio, è possibile configurare una conversazione in modo che l'endpoint di conversazione dell'iniziatore abbia il livello di priorità 10 e che l'endpoint di destinazione abbia il livello di priorità 1. In questo caso:

  • I messaggi trasmessi dal servizio di origine usando il livello di priorità 10 vengono ricevuti dalla coda di destinazione usando il livello di priorità 1.

  • I messaggi trasmessi dal servizio di destinazione usando il livello di priorità 10 vengono ricevuti dalla coda dell'iniziatore usando il livello di priorità 1.

A un gruppo di conversazioni viene assegnato lo stesso livello di priorità del livello più alto assegnato a qualsiasi conversazione in cui si verificano queste condizioni:

  • La conversazione fa parte di un gruppo.

  • La conversazione contiene attualmente dei messaggi nella coda del servizio.

A tutti gli endpoint di conversazione di un database viene assegnata una priorità predefinita di livello 5, se non sono state create priorità di conversazione nel database.

Le priorità di conversazione non influiscono sull'inoltro dei messaggi, che opera sempre al livello di priorità predefinito 5.

Esempi della priorità di conversazione

Si consideri un sistema con:

  • Un InitiatorDB che contiene un InitiatorService e InitiatorQueue.

  • Un TargetDB che contiene un TargetService e TargetQueue.

  • Un contratto denominato SimpleContract che specifica l'invio di RequestMessages da InitiatorService a TargetService. Specifica inoltre che i ReplyMessages siano inviati da TargetService a InitiatorService.

Questo script specifica il livello di priorità dell'endpoint di conversazione dell'iniziatore 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à dell'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

Come funzionano le 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 provenienti da conversazioni con priorità alta passano meno tempo in coda rispetto ai messaggi provenienti da conversazioni con priorità bassa.

Livelli di priorità di 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 determinano il set di messaggi recuperati dalla funzione RECEIVE e la sequenza in cui vengono recuperati i messaggi:

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

    • RECEIVE senza clausola WHERE recupera i messaggi che appartengono al gruppo di conversazioni sbloccato con priorità più alta che contiene messaggi in coda.

    • RECEIVE con una clausola WHERE recupera i messaggi del 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. Tutti i messaggi della conversazione con il livello di priorità più alto vengono prima recuperati, quindi i messaggi della successiva conversazione con il livello di priorità più alto e così via.

  • In una conversazione, i messaggi vengono recuperati nella stessa sequenza in cui sono stati inviati.

GET CONVERSATION GROUP restituisce il gruppo con il livello di priorità più alto dal set di gruppi sbloccati con messaggi in coda.

Livelli di priorità di 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à tra tutte le code di trasmissione in un'istanza del motore di database. Service Broker trasmette prima i messaggi dalle conversazioni con priorità 10 in tutte le code di trasmissione, quindi i messaggi provenienti da conversazioni con priorità 9 e così via.

La relativa differenza nelle prestazioni dei messaggi aumenta con la differenza nei livelli di priorità. In un sistema che usa due livelli di priorità adiacenti, ad esempio 9 e 10, i messaggi con un livello di priorità superiore avranno un piccolo vantaggio in termini di prestazioni. In un sistema che usa due livelli di priorità distanti, ad esempio 1 e 10, i messaggi con il livello di priorità superiore avranno un grande vantaggio in termini di prestazioni. Nei sistemi che usano più livelli di priorità, la maggior parte dell'elaborazione viene allocata nei primi 2 o 3 livelli di priorità.

I livelli di priorità specificati nelle priorità di conversazione vengono applicati ai messaggi nella coda di trasmissione solo se l'opzione di database HONOR_BROKER_PRIORITY è impostata su ON. Se l'opzione HONOR_BROKER_PRIORITY è impostata su OFF, a tutti i messaggi nella coda di trasmissione del database viene assegnato il livello di priorità predefinito 5. Se viene visualizzato usando sys.transmission_queue, il messaggio visualizza il livello di priorità che riceve dall'endpoint, ma per trasmettere il messaggio viene usato il livello di priorità predefinito.

Poiché i livelli di priorità vengono applicati ai messaggi nella coda di trasmissione, solitamente non influiscono sui messaggi inviati tra i servizi nella stessa istanza del motore di database. I messaggi inviati a un servizio nella stessa istanza vengono inseriti direttamente nella coda del servizio, senza passare da una coda di trasmissione. Alcune condizioni potrebbero causare l'inattività dei messaggi locali nella coda di trasmissione, ad esempio alcuni tipi di errori o l'inattività della coda di destinazione. Se il messaggio viene archiviato nella coda di trasmissione, viene applicato il livello di priorità pertinente.

I messaggi e i frammenti di messaggio possono essere inviati senza seguire l'ordine di priorità:

  • Service Broker invia i messaggi tra le istanze del motore di database usando blocchi di frammenti di messaggi. Se sono presenti diversi frammenti di messaggio con priorità diverse pronti per essere inviati a un'istanza, Service Broker può inviare tutti i frammenti in un unico blocco. Alcuni frammenti alla fine del blocco possono avere un livello di priorità inferiore rispetto ai frammenti di messaggio in attesa di essere trasmessi 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 prima di altri messaggi in coda con priorità più alta.

Anche se i singoli messaggi o frammenti di messaggio possono essere inviati senza seguire l'ordine di priorità, gli effetti dovrebbero essere minimi se si considera la mole di messaggi inviati.

Vedi anche