Freigeben über


Dienstvermittler

Gilt für:SQL ServerAzure 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.

Diagramm des Dienstbroker-Prozessflusses.

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:

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.

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_timewie 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).