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.
Einsatz von Service Broker
Verwenden Sie Service Broker-Komponenten, um native, datenbankinterne asynchrone Nachrichtenverarbeitungsfunktionen zu implementieren. Anwendungsentwickler, die Service Broker verwenden, können Datenarbeitsauslastungen zwischen mehreren Datenbanken verteilen, ohne komplizierte Besonderheiten von Kommunikation und Messaging 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 für die Konversation zwischen den Diensten mit der Transact-SQL-Anweisung SEND 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 Transact-SQL-Anweisung RECEIVE 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 Konversation mit der Transact-SQL-Anweisung END CONVERSATION 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
,ALTER
undDROP
Anweisungen - Transact-SQL-Anweisungen
- Service Broker-Katalogsichten (Transact-SQL)
- Dynamische Verwaltungssichten in Verbindung mit Service Broker (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 BINDING
wird nicht unterstützt.
Der Dienstbroker ist standardmäßig aktiviert und kann nicht deaktiviert werden. Die folgenden ALTER DATABASE
Optionen werden nicht unterstützt:
ENABLE_BROKER
DISABLE_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 zu ermöglichen, indem mehrere Unterhaltungshandles unterstützt werden.
Warteschlangen machen die Nachrichtenwartezeit verfügbar
Warteschlangen haben eine neue Spalte, die zeigt, message_enqueue_time
wie lange eine Nachricht in der Warteschlange war.
Behandlung nicht verarbeitbarer Nachrichten kann deaktiviert werden
Die CREATE QUEUE- und ALTER QUEUE-Anweisungen haben jetzt die Möglichkeit, die Behandlung von Giftnachrichten durch Hinzufügen der Klausel POISON_MESSAGE_HANDLING (STATUS = ON | OFF)
zu aktivieren oder zu 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).