Gestire le identità di Service Broker

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Ogni database contiene un identificatore univoco usato per il routing dei messaggi di Service Broker verso il database. Questo argomento descrive gli identificatori di Service Broker, il modo in cui Service Broker protegge da errori di reindirizzamento dei messaggi e le opzioni disponibili per gestire gli identificatori di Service Broker.

Identificatori di Service Broker

Ogni database contiene un identificatore di Service Broker che lo distingue da tutti gli altri database nella rete. Nella colonna service_broker_guid della vista del catalogo sys.databases è riportato l'identificatore di Service Broker per ogni database nell'istanza. I sistemi di Service Broker possono essere progettati per eseguire più copie di un servizio. Ogni copia del servizio viene eseguita in un database separato. In un sistema con più copie di un servizio, usare la clausola BROKER_INSTANCE dell'istruzione CREATE ROUTE per creare una route a una copia specifica del servizio.

Il routing di Service Broker usa l'identificatore di Service Broker per garantire il recapito di tutti i messaggi di una conversazione allo stesso database. L'istruzione BEGIN DIALOG CONVERSATION apre una conversazione con un servizio di destinazione. Se una conversazione viene aperta correttamente, il messaggio di acknowledgement del servizio di destinazione contiene l'identificatore di Service Broker per il database di destinazione. Service Broker esegue quindi il routing tutti i messaggi per la conversazione verso il database specificato.

Gli identificatori di Service Broker possono essere specificati nella clausola TO SERVICE dell'istruzione BEGIN DIALOG CONVERSATION per controllare il tipo di routing da eseguire:

  • Per eseguire il routing delle conversazioni verso una copia specifica di un servizio, specificare service_broker_guid. Ad esempio, è possibile avere tre copie di un servizio in tre database in rete: un database di sviluppo, un database di test e un database di produzione. Le istruzioni BEGIN DIALOG CONVERSATION in ogni sistema devono specificare service_broker_guid per assicurare che tutti i messaggi vadano al database corretto.

  • Per consentire a Service Broker di bilanciare i carichi delle conversazioni tra più copie di un servizio, non specificare service_broker_guid. In alternativa, Service Broker sceglierà tra le route con lo stesso nome di servizio specificato nella clausola TO SERVICE di BEGIN DIALOG CONVERSATION.

Per impostazione predefinita, se è disponibile una sola copia di un servizio in una rete, Service Broker esegue correttamente il routing delle conversazioni. Non è necessario specificare l'identificatore di Service Broker nelle istruzioni CREATE ROUTE o BEGIN DIALOG CONVERSATION.

Per altre informazioni sulla corrispondenza delle route di Service Broker, vedere Routing di Service Broker.

Per supportare correttamente il recapito dei messaggi, ogni identificatore di Service Broker deve essere univoco tra tutte le istanze del motore di database nella stessa rete. In caso contrario, i messaggi potrebbero essere indirizzati in modo errato. Ai nuovi database creati viene assegnato un nuovo identificatore di Service Broker che deve essere univoco nella rete. L'identificatore si ripristina quando viene ripristinato o collegato il database. Prestare attenzione quando si ripristinano e si collegano i database. Evitare che più database eseguano in modo attivo le operazioni di Service Broker e usino gli stessi identificatori.

Recapito messaggi di Service Broker

In SQL Server è disponibile un meccanismo per la disattivazione del recapito dei messaggi di Service Broker in un database, se presenta lo stesso identificatore di Service Broker di un altro database nella stessa rete. Quando il recapito dei messaggi viene disattivato in un database, tutti i messaggi inviati dal database rimangono nella coda di trasmissione del database. Inoltre, in Service Broker i servizi di tale database non vengono considerati disponibili per la ricezione di messaggi, ad esempio nel caso in cui in un'istanza venga individuato un servizio di destinazione dal routing di Service Broker.

La disattivazione del recapito dei messaggi di Service Broker consente la connessione sicura di un backup di un database per la risoluzione di problemi o il recupero dei dati, evitando il rischio di un indirizzamento errato dei messaggi. Nella colonna is_broker_enabled della vista del catalogo sys.databases è riportato lo stato corrente del recapito dei messaggi di Service Broker per ogni database.

Quando si connette o si ripristina un database, verificare con attenzione che il recapito dei messaggi sia attivo per un unico database con un determinato identificatore di Service Broker. In caso contrario, i messaggi potrebbero essere indirizzati in modo errato e l'elaborazione della conversazione potrebbe avvenire nella copia errata del database.

Gestire gli identificatori e il recapito dei messaggi

I comandi CREATE DATABASE, ALTER DATABASE e RESTORE DATABASE contengono le opzioni per attivare il recapito dei messaggi di Service Broker, nonché le opzioni per modificare l'identificatore di Service Broker per un database.

Per impostazione predefinita, quando si connette o si ripristina un database, l'identificatore e lo stato di recapito dei messaggi di Service Broker rimangono invariati. In genere, l'identificatore di Service Broker non viene modificato nelle situazioni seguenti:

  • Quando si ripristina un backup per recuperare dei dati.

  • Quando si configura una coppia duplicata.

  • Quando si configura il log shipping per un server di standby. Quando si esegue una copia del database, si modifica l'identificatore dell'istanza.

Sono disponibili quattro opzioni per gestire gli identificatori e il recapito dei messaggi:

  • ENABLE_BROKER. Questa opzione attiva il recapito dei messaggi di Service Broker, conservando l'identificatore esistente di Service Broker per il database.

    Nota

    L'abilitazione di SQL Server Service Broker in un database richiede un blocco a livello del database. Per abilitare Service Broker nel database msdb, arrestare prima SQL Server Agent. Service Broker può quindi ottenere il blocco necessario.

  • DISABLE_BROKER. Questa opzione disattiva il recapito dei messaggi di Service Broker, conservando l'identificatore esistente di Service Broker per il database.

  • NEW_BROKER. Questa opzione attiva il recapito dei messaggi di Service Broker e crea un nuovo identificatore di Service Broker per il database. L'opzione termina tutte le conversazioni presenti nel database e restituisce un errore per ogni conversazione. Ciò è dovuto al fatto che queste conversazioni non usano il nuovo identificatore. Tutte le route che fanno riferimento all'identificatore di Service Broker precedente devono essere ricreate con il nuovo identificatore.

  • ERROR_BROKER_CONVERSATIONS. Questa opzione attiva il recapito dei messaggi di Service Broker, conservando l'identificatore esistente di Service Broker per il database. Service Broker termina tutte le conversazioni nel database e restituisce un errore per ogni conversazione. In genere, questa opzione viene usata quando è necessario ripristinare un database in un momento diverso rispetto ad altri database con cui ha delle conversazioni aperte. Tutte le conversazioni nel database ripristinato devono essere terminate con un errore, perché ora non sono sincronizzate con gli altri database. L'identificatore di Service Broker viene mantenuto in modo che tutte le route che vi fanno riferimento siano ancora valide.

Indipendentemente dall'opzione specificata, SQL Server non consente l'attivazione del recapito dei messaggi nella stessa istanza di SQL Server per due database con lo stesso identificatore di Service Broker. Se si connette un database con lo stesso identificatore di Service Broker di un database esistente, SQL Server disattiva il recapito dei messaggi di Service Broker nel database collegato.

Per altre informazioni sulle opzioni per il collegamento dei database, vedere CREATE DATABASE e ALTER DATABASE (Transact-SQL). Per informazioni su come attivare il recapito dei messaggi di Service Broker in un database, vedere Procedura: Attivare il recapito dei messaggi di Service Broker nei database (Transact-SQL).

Vedi anche