Service Broker
Si applica a: SQL Server Istanza gestita di SQL di Azure
SQL Server Service Broker offre supporto nativo per la messaggistica e l'accodamento nel motore di database di SQL Server e in Istanza gestita di SQL di Azure. Gli sviluppatori possono creare facilmente applicazioni complesse che usano i componenti del motore di database per la comunicazione tra vari database, nonché compilare applicazioni distribuite e affidabili.
Quando usare Service Broker
Usare i componenti di Service Broker per implementare funzionalità di elaborazione di messaggi asincroni nel database native. Gli sviluppatori di applicazioni che utilizzano Service Broker possono distribuire il carico di lavoro su più database senza programmare interni di comunicazione e messaggistica complessi. Service Broker riduce le attività di sviluppo e test perché gestisce i percorsi di comunicazione nel contesto di una conversazione, con conseguente miglioramento delle prestazioni. Ad esempio, i database front-end che supportano i siti Web possono registrare le informazioni e mettere in coda le attività con molti processi nei database back-end. Service Broker assicura che tutte le attività vengano gestite nel contesto delle transazioni per garantire affidabilità e coerenza tecnica.
Panoramica
Service Broker è un framework di recapito messaggi che consente di creare applicazioni orientate ai servizi nel database native. A differenza delle classiche funzionalità di elaborazione query che leggono continuamente i dati dalle tabelle e li elaborano durante il ciclo di vita della query, nell'applicazione orientata ai servizi sono presenti servizi di database che scambiano i messaggi. Ogni servizio ha una coda in cui i messaggi vengono inseriti fino a quando non vengono elaborati.
I messaggi nelle code possono essere recuperati tramite il comando RECEIVE
di Transact-SQL o dalla procedura di attivazione che viene chiamata quando il messaggio arriva nella coda.
Creazione di servizi
È possibile creare i servizi di database tramite l'istruzione Transact SQL CREATE SERVICE. Il servizio può essere associato alla coda di messaggi creata tramite l'istruzione CREATE QUEUE:
CREATE QUEUE dbo.ExpenseQueue;
GO
CREATE SERVICE ExpensesService
ON QUEUE dbo.ExpenseQueue;
Invio di messaggi
I messaggi vengono inviati nella conversazione tra i servizi usando l'istruzione Transact-SQL SEND. Una conversazione è un canale di comunicazione che viene stabilito tra i servizi usando l'istruzione Transact-SQL BEGIN DIALOG
.
DECLARE @dialog_handle UNIQUEIDENTIFIER;
BEGIN DIALOG @dialog_handle
FROM SERVICE ExpensesClient
TO SERVICE 'ExpensesService';
SEND ON CONVERSATION @dialog_handle (@Message) ;
Il messaggio verrà inviato a ExpenssesService
e inserito in dbo.ExpenseQueue
. Poiché a questa coda non è associata alcuna procedura di attivazione, il messaggio rimarrà nella coda fino a quando non verrà letto da qualcuno.
Elaborazione di messaggi
I messaggi inseriti nella coda possono essere selezionati usando una query SELECT
standard. L'istruzione SELECT
non modifica la coda, né rimuove i messaggi. Per la lettura e il pull dei messaggi dalla coda, è possibile usare l'istruzione Transact-SQL RECEIVE.
RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue;
Dopo aver elaborato tutti i messaggi della coda, chiudere la conversazione usando l'istruzione Transact-SQL END CONVERSATION.
Dove si trova la documentazione per Service Broker?
La documentazione di riferimento per Service Broker è inclusa nella documentazione di SQL Server. Nella documentazione di riferimento sono incluse le sezioni seguenti:
Istruzioni DDL (Data Definition Language) (Transact-SQL) per le istruzioni CREATE, ALTER e DROP
Viste a gestione dinamica relative a Service Broker (Transact-SQL)
Vedere la documentazione pubblicata in precedenza per i concetti relativi a Service Broker e per le attività di gestione e sviluppo. Questa documentazione non viene riprodotta nella documentazione di SQL Server a causa del numero ridotto di modifiche apportate a Service Broker nelle versioni recenti di SQL Server.
Novità di Service Broker
Service broker e Istanza gestita di SQL di Azure
Lo scambio di messaggi di Service Broker tra istanze di Istanza gestita di SQL di Azure e lo scambio di messaggi tra SQL Server e Istanza di gestione SQL di Azure è attualmente disponibile nell’anteprima pubblica:
CREATE ROUTE
: La porta specificata deve essere la 4022. Vedere CREATE ROUTE.ALTER ROUTE
: La porta specificata deve essere la 4022. Vedere ALTER ROUTE.
La sicurezza del trasporto è supportata, ma non quella del dialogo:
CREATE REMOTE SERVICE BINDING
non è supportata.
Service Broker è abilitato per impostazione predefinita e non può essere disabilitato. Le opzioni di ALTER DATABASE seguenti non sono supportate:
ENABLE_BROKER
DISABLE_BROKER
Non sono state introdotte modifiche significative in SQL Server 2019 (15.x). In SQL Server 2012 (11.x) sono state introdotte le modifiche seguenti.
È possibile inviare messaggi a più servizi di destinazione (multicast)
La sintassi dell'istruzione SEND (Transact-SQL) è stata estesa per abilitare il multicast supportando più handle di conversazione.
Le code espongono il tempo di accodamento del messaggio
Le code dispongono di una nuova colonna, message_enqueue_timein cui è indicato il tempo di accodamento di un messaggio.
La gestione dei messaggi non elaborabili può essere disabilitata
Tramite le istruzioni CREATE QUEUE (Transact-SQL) e ALTER QUEUE (Transact-SQL) è possibile abilitare o disabilitare la gestione dei messaggi non elaborabili aggiungendo la clausola POISON_MESSAGE_HANDLING (STATUS = ON | OFF)
. La vista del catalogo sys.service_queues contiene ora la colonna is_poison_message_handling_enabled per indicare se il messaggio non elaborabile è abilitato o disabilitato.
Supporto Always On in Service Broker
Per altre informazioni, vedere Service Broker con i gruppi di disponibilità Always On (SQL Server).
Passaggi successivi
L'uso più comune di Service Broker è la notifica degli eventi. Informazioni su come implementare notifiche degli eventi, configurare la sicurezza delle finestre di dialogo o ottenere altre informazioni.