Broker Usług

Dotyczy:programu SQL ServerAzure SQL Managed Instance

Usługa SQL Server Service Broker zapewnia natywną obsługę komunikatów i kolejkowania w mechanizmie bazy danych programu SQL Server oraz Azure SQL Managed Instance. Deweloperzy mogą łatwo tworzyć zaawansowane aplikacje, które używają składników aparatu bazy danych do komunikowania się między różnymi bazami danych i tworzyć rozproszone i niezawodne aplikacje.

Kiedy należy używać usługi Service Broker

Użyj składników usługi Service Broker, aby zaimplementować natywne funkcje asynchronicznego przetwarzania komunikatów w bazie danych. Deweloperzy aplikacji korzystający z usługi Service Broker mogą dystrybuować obciążenia danych w kilku bazach danych bez programowania złożonych wewnętrznych komunikacji i obsługi komunikatów. Usługa Service Broker zmniejsza prace programistyczne i testowe, ponieważ usługa Service Broker obsługuje ścieżki komunikacyjne w kontekście konwersacji. Zwiększa również wydajność. Na przykład bazy danych front-end obsługujące strony internetowe mogą rejestrować informacje i wysyłać zadania wymagające dużego przetwarzania do kolejki w bazach danych back-end. Usługa Service Broker zapewnia, że wszystkie zadania są zarządzane w kontekście transakcji w celu zapewnienia niezawodności i spójności technicznej.

Przegląd

Service Broker to platforma dostarczania komunikatów, która umożliwia tworzenie natywnych aplikacji zorientowanych na usługi w bazie danych. W przeciwieństwie do klasycznych funkcji przetwarzania zapytań, które stale odczytują dane z tabel i przetwarzają je podczas cyklu życia zapytania, aplikacje zorientowane na usługi mają usługi bazy danych, które wymieniają komunikaty. Każda usługa ma kolejkę, w której komunikaty są umieszczane do momentu, kiedy one zostaną przetworzone.

Diagram przepływu procesów usługi Service Broker.

Komunikaty w kolejkach można pobrać przy użyciu polecenia Transact-SQL RECEIVE lub przez procedurę aktywacji wywoływaną za każdym razem, gdy komunikat pojawi się w kolejce.

Tworzenie usług

Uwaga / Notatka

Usługa docelowa musi uwidocznić co najmniej jeden kontrakt. Jeśli tworzysz usługę bez kontraktów, nie będzie można odbierać komunikatów. Wysłane komunikaty będą wydawać się wysłane pomyślnie, ale pozostaną w kolejce sys.transmission_queue inicjatora.

/*
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]);

Wysyłanie komunikatów

Wiadomości są wysyłane podczas konwersacji między usługami przy użyciu SEND instrukcji Transact-SQL. Konwersacja to kanał komunikacyjny ustanowiony między usługami przy użyciu instrukcji 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"/>');

Wiadomość jest wysyłana do pliku ExpensesService i umieszczona w pliku dbo.ExpenseQueue. Ponieważ nie ma procedury aktywacji skojarzonej z tą kolejką, komunikat pozostaje w kolejce, dopóki ktoś go nie odczytuje.

Przetwórz wiadomości

Komunikaty umieszczone w kolejce można wybrać przy użyciu standardowego zapytania SELECT. Instrukcja SELECT nie modyfikuje kolejki i nie usuwa komunikatów. Aby odczytać i ściągnąć komunikaty z kolejki, możesz użyć RECEIVE instrukcji 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

Po przetworzeniu wszystkich komunikatów z kolejki należy zakończyć konwersację za pomocą instrukcji 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

Dokumentacja usługi Service Broker

Aby uzyskać więcej informacji na temat usługi Service Broker, zobacz:

Możesz również zapoznać się z wcześniej opublikowaną dokumentacją dotyczącą pojęć związanych z usługą Service Broker oraz zadań związanych z programowaniem i zarządzaniem.

Co nowego w usłudze Service Broker

Service Broker i Azure SQL Managed Instance

Wymiana komunikatów usługi Service Broker między wystąpieniami usługi Azure SQL Managed Instance oraz wymiana komunikatów między programem SQL Server a usługą Azure SQL Managed Instance jest obecnie dostępna w publicznej wersji zapoznawczej:

Obsługiwane są zabezpieczenia transportowe, natomiast zabezpieczenia dialogowe nie są wspierane.

  • CREATE REMOTE SERVICE BINDING nie jest obsługiwany.

Usługa Service Broker jest domyślnie włączona i nie można jej wyłączyć. Następujące ALTER DATABASE opcje nie są obsługiwane:

  • ENABLE_BROKER
  • DISABLE_BROKER

Nie wprowadzono żadnych znaczących zmian w programie SQL Server 2019 (15.x). W programie SQL Server 2012 wprowadzono następujące zmiany (11.x).

Komunikaty mogą być wysyłane do wielu usług docelowych (multiemisji)

Składnia instrukcji SEND została rozszerzona, aby umożliwić multicast przez obsługę wielu uchwytów konwersacji.

Kolejki uwidaczniają czas kolejkowania komunikatu

Kolejki mają nową kolumnę message_enqueue_time, która pokazuje czas przebywania wiadomości w kolejce.

Można wyłączyć obsługę komunikatów zatrutych

Instrukcje CREATE QUEUE i ALTER QUEUE mają teraz możliwość włączania lub wyłączania obsługi komunikatów trucizny przez dodanie klauzuli POISON_MESSAGE_HANDLING (STATUS = ON | OFF). Widok sys.service_queues wykazu zawiera teraz kolumnę is_poison_message_handling_enabled wskazującą, czy komunikat trucizny jest włączony, czy wyłączony.

Obsługa grup dostępności w usłudze Service Broker

Aby uzyskać więcej informacji, zobacz Broker Usług z grupami dostępności Always On (SQL Server).