Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 inviare attività ad alta intensità di processo in coda 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 native nel database. A differenza delle funzionalità di elaborazione delle query classiche che leggono costantemente i dati dalle tabelle e li elaborano durante il ciclo di vita delle query, le applicazioni orientate ai servizi dispongono di servizi di database che scambiano i messaggi. Ogni servizio ha una coda in cui vengono inseriti i messaggi fino a quando non vengono elaborati.
I messaggi nelle code possono essere recuperati usando il comando Transact-SQL RECEIVE o tramite la procedura di attivazione chiamata ogni volta che il messaggio arriva nella coda.
Creare servizi
Annotazioni
Un servizio di destinazione deve esporre uno o più contratti. Se si crea un servizio senza contratti, non sarà possibile ricevere messaggi. I messaggi inviati sembreranno avere successo, ma rimarranno nella sys.transmission_queue dell'iniziatore.
/*
In this example, the initiator must then use ON CONTRACT [DEFAULT] and a MESSAGE TYPE [DEFAULT]. [DEFAULT] is a delimited identifier for the built‑in contract and isn't a T‑SQL keyword, so it must be bracketed or quoted.
*/
CREATE QUEUE dbo.ExpenseQueue;
GO
CREATE SERVICE ExpensesService
ON QUEUE dbo.ExpenseQueue ([DEFAULT]);
Inviare 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.
-- Begin a dialog
DECLARE @dialog_handle AS UNIQUEIDENTIFIER;
BEGIN DIALOG @dialog_handle
FROM SERVICE ExpensesClient
TO SERVICE N'ExpensesService'
ON CONTRACT [DEFAULT];
-- Send a message
SEND ON CONVERSATION (@dialog_handle)
MESSAGE TYPE [DEFAULT] (N'<Expense ExpenseId="1" Amount="123.45" Currency="USD"/>');
Il messaggio viene inviato all'oggetto ExpensesService e inserito in dbo.ExpenseQueue. Poiché non esiste alcuna procedura di attivazione associata a questa coda, il messaggio rimane nella coda finché non viene letto da un utente.
Elaborare i messaggi
I messaggi inseriti nella coda possono essere selezionati usando una query SELECT standard. L'istruzione SELECT non modifica la coda e rimuove i messaggi. Per la lettura e l'estrazione dei messaggi dalla coda, è possibile usare l'istruzione Transact-SQL RECEIVE.
RECEIVE TOP (1)
conversation_handle,
message_type_name,
TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO
Dopo che hai elaborato tutti i messaggi della coda, dovresti chiudere la conversazione usando l'istruzione Transact-SQL END CONVERSATION.
-- Drain any remaining target conversations for the from the queue
DECLARE @conversation_hdl AS UNIQUEIDENTIFIER;
WHILE EXISTS (SELECT 1 FROM dbo.ExpenseQueue)
BEGIN
RECEIVE TOP (1) @conversation_hdl = conversation_handle FROM dbo.ExpenseQueue;
END CONVERSATION @conversation_hdl;
END
GO
Documentazione di Service Broker
Per altre informazioni su Service Broker, vedere:
- Istruzioni del linguaggio di definizione dei dati per
CREATEistruzioni ,ALTEReDROP - istruzioniTransact-SQL
- Viste del catalogo di Service Broker (Transact-SQL)
- Viste di gestione dinamica di Service Broker (Transact-SQL)
- utilità ssbdiagnose (Service Broker)
È anche possibile fare riferimento alla documentazione pubblicata in precedenza per i concetti di Service Broker e per le attività di sviluppo e gestione.
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 in anteprima pubblica:
-
CREATE ROUTE: La porta specificata deve essere la 4022. Vedere CREATE ROUTE (Transact-SQL). -
ALTER ROUTE: La porta specificata deve essere la 4022. Vedere ALTER ROUTE (Transact-SQL).
La sicurezza del trasporto è supportata, mentre la sicurezza dei dialoghi non lo è.
-
CREATE REMOTE SERVICE BINDINGnon è supportata.
Service Broker è abilitato per impostazione predefinita e non può essere disabilitato. Le opzioni seguenti ALTER DATABASE non sono supportate:
ENABLE_BROKERDISABLE_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 è stata estesa per abilitare il multicast supportando più handle di conversazione.
Le code espongono l'ora di accodamento del messaggio
Le code hanno una nuova colonna, message_enqueue_time, che mostra per quanto tempo un messaggio è presente nella coda.
La gestione dei messaggi problematici può essere disabilitata
Le istruzioni CREATE QUEUE e ALTER QUEUE ora possono abilitare o disabilitare la gestione dei messaggi non elaborabili aggiungendo la clausola POISON_MESSAGE_HANDLING (STATUS = ON | OFF). La vista sys.service_queues del catalogo include ora la colonna is_poison_message_handling_enabled per indicare se il messaggio non elaborabili è abilitato o disabilitato.
Supporto del gruppo di disponibilità in Service Broker
Per ulteriori informazioni, vedere Service Broker with Always On Availability Groups (SQL Server).