Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Managed Instance
SQL Server Service Broker poskytuje nativní podporu pro zasílání zpráv a řazení do front v databázovém stroji SQL Serveru a Azure SQL Managed Instance. Vývojáři můžou snadno vytvářet sofistikované aplikace, které používají komponenty databázového stroje ke komunikaci mezi různorodými databázemi a vytvářet distribuované a spolehlivé aplikace.
Kdy použít Service Broker
Pomocí komponent Service Broker můžete implementovat nativní funkce asynchronního zpracování zpráv v databázi. Vývojáři aplikací, kteří používají Service Broker, můžou distribuovat datové úlohy napříč několika databázemi bez programování složité komunikace a interních zpráv. Service Broker snižuje práci na vývoji a testování tím, že zpracovává komunikační cesty v rámci konverzace. Zvyšuje také výkon. Front-endové databáze podporující weby můžou například zaznamenávat informace a odesílat úlohy náročné na zpracování do fronty v back-endových databázích. Service Broker zajišťuje, že všechny úlohy se spravují v kontextu transakcí, aby se zajistila spolehlivost a technická konzistence.
Přehled
Service Broker je architektura pro doručování zpráv, která umožňuje vytvářet nativní aplikace orientované na databázovou službu. Na rozdíl od klasických funkcí zpracování dotazů, které neustále čtou data z tabulek a zpracovávají je během životního cyklu dotazů, mají aplikace orientované na služby databázové služby, které vyměňují zprávy. Každá služba má frontu, do které se zprávy umístí, dokud se nezpracují.
Zprávy ve frontách je možné načíst pomocí příkazu Transact-SQL RECEIVE nebo aktivační procedurou, která se volá při příchodu zprávy do fronty.
Vytváření služeb
Poznámka:
Cílová služba musí zveřejnit jeden nebo více kontraktů. Pokud vytvoříte službu bez kontraktů, nebude možné přijímat zprávy. Odeslané zprávy budou vypadat úspěšně, ale zprávy zůstanou na sys.transmission_queue iniciátora.
/*
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]);
Odesílání zpráv
Zprávy se odesílají v konverzaci mezi službami pomocí příkazu SEND Transact-SQL. Konverzace je komunikační kanál vytvořený mezi službami pomocí příkazu BEGIN DIALOG Transact-SQL.
-- 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"/>');
Zpráva je odeslána na ExpensesService a umístěna v dbo.ExpenseQueue. Vzhledem k tomu, že k této frontě není přidružený žádný aktivační postup, zůstane zpráva ve frontě, dokud ji někdo nepřečte.
Zpracování zpráv
Zprávy umístěné ve frontě lze vybrat pomocí standardního dotazu SELECT. Příkaz SELECT neupravuje frontu ani neodstraňuje zprávy. Ke čtení a načítání zpráv z fronty můžete použít příkaz RECEIVE Transact-SQL.
RECEIVE TOP (1)
conversation_handle,
message_type_name,
TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO
Jakmile zpracujete všechny zprávy z fronty, měli byste konverzaci zavřít pomocí příkazu END CONVERSATION Transact-SQL.
-- 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
Dokumentace ke službě Service Broker
Další informace o službě Service Broker najdete tady:
-
Příkazy jazyka Data Definition Language pro
CREATEpříkazy aALTERDROPpříkazy - příkazyTransact-SQL
- zobrazení katalogu Service Broker (Transact-SQL)
- zobrazení dynamické správy související se službou Service Broker (Transact-SQL)
- Nástroj ssbdiagnose (Service Broker)
Můžete se také podívat na dříve publikovanou dokumentaci pro koncepty service brokeru a úlohy vývoje a správy.
Co je nového ve službě Service Broker
Service Broker a Spravovaná instance Azure SQL
Výměna zpráv služby Service Broker mezi instancemi služby Azure SQL Managed Instance a výměnou zpráv mezi SQL Serverem a službou Azure SQL Manage Instance je aktuálně ve verzi Public Preview:
-
CREATE ROUTE: Zadaný port musí být 4022. Viz CREATE ROUTE (Transact-SQL). -
ALTER ROUTE: Zadaný port musí být 4022. Viz ALTER ROUTE (Transact-SQL).
Zabezpečení přenosu je podporováno, zatímco zabezpečení dialogového okna není:
-
CREATE REMOTE SERVICE BINDINGnení podporováno.
Služba Service Broker je ve výchozím nastavení povolená a nejde ji zakázat.
ALTER DATABASE Následující možnosti nejsou podporované:
ENABLE_BROKERDISABLE_BROKER
V SQL Serveru 2019 (15.x) nebyly zavedeny žádné významné změny. V SQL Serveru 2012 (11.x) byly zavedeny následující změny.
Zprávy je možné odesílat do více cílových služeb (vícesměrové vysílání).
Syntaxe příkazu SEND byla rozšířena na podporu multicastu pomocí více handle konverzací.
Fronty zpřístupňují čas zařazení zprávy do fronty
Fronty mají nový sloupec, který ukazuje, message_enqueue_timejak dlouho byla zpráva ve frontě.
Zpracování jedovatých zpráv je možné zakázat.
Příkazy CREATE QUEUE a ALTER QUEUE nyní mají možnost povolit nebo zakázat zpracování otrávených zpráv přidáním klauzule, POISON_MESSAGE_HANDLING (STATUS = ON | OFF). Zobrazení katalogu sys.service_queues teď obsahuje sloupec is_poison_message_handling_enabled , který označuje, jestli je povolená nebo zakázaná zpráva o jedu.
Podpora skupin dostupnosti ve službě Service Broker
Další informace naleznete v tématu Service Broker se skupinami dostupnosti AlwaysOn (SQL Server).