Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL Managed Instance
SQL Server Service Broker bietet native Unterstützung für Messaging und Warteschlangen in SQL Server-Datenbank-Engine und Azure SQL Managed Instance. Entwickler können problemlos anspruchsvolle Anwendungen erstellen, die die Datenbank-Engine-Komponenten verwenden, um zwischen verschiedenen Datenbanken zu kommunizieren und verteilte und zuverlässige Anwendungen zu erstellen.
Wann Service Broker verwendet werden sollte
Verwenden Sie Service Broker-Komponenten, um native, datenbankinterne asynchrone Nachrichtenverarbeitungsfunktionen zu implementieren. Anwendungsentwickler, die Service Broker verwenden, können Datenworkloads auf mehrere Datenbanken verteilen, ohne komplexe interne Kommunikations- und Nachrichtenverarbeitungsmechanismen programmieren zu müssen. Service Broker reduziert die Entwicklungs- und die Testarbeit, da Service Broker die Kommunikationspfade im Kontext einer Konversation behandelt. Außerdem wird die Leistung verbessert. Front-End-Datenbanken, die Websites unterstützen, können z. B. Informationen aufzeichnen und prozessintensive Tasks an die Warteschlange von Back-End-Datenbanken senden. Service Broker stellt sicher, dass alle Tasks im Kontext von Transaktionen verwaltet werden, um die Zuverlässigkeit und technische Konsistenz zu gewährleisten.
Übersicht
Service Broker ist ein Nachrichtenübermittlungsframework, das das Erstellen nativer, datenbankinterner dienstorientierter Anwendungen ermöglicht. Im Gegensatz zu klassischen Abfrageverarbeitungsfunktionen, die ständig Daten aus den Tabellen lesen und während des Abfragelebenszyklus verarbeiten, verfügen dienstorientierte Anwendungen über Datenbankdienste, die die Nachrichten austauschen. Jeder Dienst verfügt über eine Warteschlange, in der die Nachrichten platziert werden, bis sie verarbeitet werden.
Die Nachrichten in den Warteschlangen können mithilfe des Befehls Transact-SQL RECEIVE oder durch die Aktivierungsprozedur abgerufen werden, die aufgerufen wird, wenn die Nachricht in der Warteschlange eingeht.
Dienste erstellen
Hinweis
Ein Zieldienst muss einen oder mehrere Verträge verfügbar machen. Wenn Sie einen Dienst ohne Verträge erstellen, kann er keine Nachrichten empfangen. Gesendete Nachrichten scheinen erfolgreich zu sein, aber die Nachrichten bleiben auf der sys.transmission_queue des Initiators
/*
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]);
Nachrichten senden
Nachrichten werden in der Unterhaltung zwischen den Diensten mithilfe der SEND Transact-SQL-Anweisung gesendet. Eine Konversation ist ein Kommunikationskanal, der zwischen den Diensten mit der Transact-SQL-Anweisung BEGIN DIALOG eingerichtet wird.
-- 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"/>');
Die Nachricht wird an ExpensesService gesendet und in dbo.ExpenseQueue platziert. Da dieser Warteschlange keine Aktivierungsprozedur zugeordnet ist, verbleibt die Nachricht in der Warteschlange, bis jemand sie vorliest.
Verarbeiten von Nachrichten
Die Nachrichten, die in die Warteschlange gestellt werden, können mit einer Standardabfrage SELECT ausgewählt werden. Die SELECT Anweisung ändert die Warteschlange nicht und entfernt die Nachrichten. Um die Nachrichten aus der Warteschlange zu lesen und abzurufen, können Sie die RECEIVE Transact-SQL-Anweisung verwenden.
RECEIVE TOP (1)
conversation_handle,
message_type_name,
TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO
Nachdem Sie alle Nachrichten aus der Warteschlange verarbeitet haben, sollten Sie die Unterhaltung mit der END CONVERSATION Transact-SQL-Anweisung schließen.
-- 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
Dokumentation zum Service Broker
Weitere Informationen zum Service Broker finden Sie unter:
-
Data Definition Language-Anweisungen für
CREATE,ALTERundDROPAnweisungen - Transact-SQL-Anweisungen
- Service Broker-Katalogsichten (Transact-SQL)
- Service Broker-bezogene dynamische Verwaltungssichten (Transact-SQL)
- ssbdiagnose utility (Service Broker)
Sie können auch auf die zuvor veröffentlichte Dokumentation für Service Broker-Konzepte und für Entwicklungs- und Verwaltungsaufgaben verweisen.
Neues in Service Broker
Dienstbroker und Azure SQL Managed Instance
Dienstbroker-Nachrichtenaustausch zwischen Instanzen von Azure SQL Managed Instance und Nachrichtenaustausch zwischen SQL Server und Azure SQL Managed Instance befindet sich derzeit in der öffentlichen Vorschau.
-
CREATE ROUTE: Als Port muss „4022“ angegeben werden. Siehe CREATE ROUTE (Transact-SQL). -
ALTER ROUTE: Als Port muss „4022“ angegeben werden. Siehe ALTER ROUTE (Transact-SQL).
Die Transportsicherheit wird unterstützt, während die Nachrichtensicherheit nicht unterstützt wird.
-
CREATE REMOTE SERVICE BINDINGwird nicht unterstützt.
Der Dienstbroker ist standardmäßig aktiviert und kann nicht deaktiviert werden. Die folgenden ALTER DATABASE Optionen werden nicht unterstützt:
ENABLE_BROKERDISABLE_BROKER
In SQL Server 2019 (15.x) wurden keine wesentlichen Änderungen eingeführt. Für SQL Server 2012 (11.x)wurden die folgenden Änderungen eingeführt.
Nachrichten können an mehrere Zieldienste gesendet werden (Multicast)
Die Syntax der SEND Anweisung wurde erweitert, um Multicast durch die Unterstützung mehrerer Konversationshandles zu ermöglichen.
Warteschlangen zeigen den Zeitpunkt an, zu dem Nachrichten in die Warteschlange eingereiht wurden
Warteschlangen haben eine neue Spalte, die zeigt, message_enqueue_timewie lange eine Nachricht in der Warteschlange war.
Die Behandlung von Poison Messages kann deaktiviert werden
Die Anweisungen CREATE QUEUE und ALTER QUEUE können nun die Poison-Message-Verarbeitung durch Hinzufügen der Klausel POISON_MESSAGE_HANDLING (STATUS = ON | OFF) aktivieren oder deaktivieren. Die Katalogansicht sys.service_queues weist nun die Spalte is_poison_message_handling_enabled auf, um anzugeben, ob die Giftnachricht aktiviert oder deaktiviert ist.
Verfügbarkeitsgruppenunterstützung im Service Broker
Weitere Informationen finden Sie unter Service Broker mit AlwaysOn-Verfügbarkeitsgruppen (SQL Server).