Поделиться через


Service Broker

Область применения: SQL Server Управляемый экземпляр SQL Azure

SQL Server Service Broker обеспечивает встроенную поддержку обмена сообщениями и очередей в SQL Server Database Engine и Azure SQL Managed Instance. Разработчики могут легко создавать сложные приложения, использующие компоненты ядро СУБД для обмена данными между разнородными базами данных, а также создавать распределенные и надежные приложения.

Когда следует использовать компонент Service Broker

Используйте компонент Service Broker для реализации собственных функций обработки асинхронных сообщений в базе данных. Разработчики приложений, использующие Service Broker, могут распределять рабочие нагрузки данных между несколькими базами данных без программирования сложных внутренних данных и обмена сообщениями. Service Broker сокращает работу по разработке и тестированию, так как Service Broker обрабатывает пути связи в контексте беседы. Кроме того, это повышает производительность. Например, базы данных начального уровня, поддерживающие веб-сайты, могут записывать информацию и отправлять ресурсоемкие задачи в очередь баз данных внутреннего уровня. Service Broker гарантирует, что все задачи управляются в контексте транзакций для обеспечения надежности и технической согласованности.

Обзор

Компонент Service Broker — это инфраструктура доставки сообщений, дающая возможность создания приложений, ориентированных на службы, внутри базы данных. В отличие от классических функций обработки запросов, которые постоянно считывают данные из таблиц и обрабатывают их во время жизненного цикла запросов, приложения, ориентированные на службы, имеют службы баз данных, обменивающиеся сообщениями. Каждая служба имеет очередь, в которой сообщения помещаются до их обработки.

Схема потока процесса Service Broker.

Сообщения в очередях можно получить с помощью команды Transact-SQL RECEIVE или процедуры активации, вызываемой при каждом поступлении сообщения в очередь.

Создание служб

Замечание

Целевой сервис должен предоставлять один или несколько контрактов. Если вы создаете службу без контрактов, она не сможет получать сообщения. Сообщения будут казаться успешно отправленными, но на самом деле они останутся в sys.transmission_queue инициатора.

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

Отправка сообщений

Сообщения отправляются во время диалога между службами с помощью инструкции Transact-SQL SEND. Диалог — канал связи, который устанавливается между службами с помощью инструкции Transact-SQL BEGIN DIALOG.

-- 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"/>');

Сообщение отправляется в ExpensesService и помещается в dbo.ExpenseQueue. Поскольку для этой очереди не предусмотрена процедура активации, сообщение остается в очереди, пока его кто-то не считывает.

Обработка сообщений

Сообщения, помещенные в очередь, можно выбрать с помощью стандартного запроса SELECT. Инструкция SELECT не изменяет очередь и удаляет сообщения. Для чтения и извлечения сообщений из очереди можно использовать инструкции Transact-SQL RECEIVE.

RECEIVE TOP (1)
    conversation_handle,
    message_type_name,
    TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO

После обработки всех сообщений из очереди необходимо закрыть диалог с помощью инструкции 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

Документация по Service Broker

Дополнительные сведения о Service Broker см. в следующем разделе:

Вы также можете ознакомиться с ранее опубликованной документацией по концепциям Service Broker и задачам разработки и управления.

Что нового в Service Broker

Service Broker и Управляемый экземпляр SQL Azure

Обмен сообщениями между экземплярами Управляемого экземпляра SQL Azure и обмен сообщениями между SQL Server и экземпляром управления SQL Azure в настоящее время находится в общедоступной предварительной версии:

Безопасность транспорта поддерживается, а безопасность диалогов не поддерживается:

  • CREATE REMOTE SERVICE BINDING не поддерживается.

Компонент Service Broker включен по умолчанию и не может быть отключен. Следующие ALTER DATABASE параметры не поддерживаются.

  • ENABLE_BROKER
  • DISABLE_BROKER

В SQL Server 2019 (15.x) не были введены существенные изменения. В SQL Server 2012 (11.x) появились следующие изменения.

Сообщения могут отправляться в несколько целевых служб (многоадресная рассылка)

Синтаксис инструкции SEND был расширен, чтобы включить многоадресную рассылку, поддерживая несколько дескрипторов бесед.

Очереди показывают время постановки сообщения в очередь

Очереди имеют новый столбец, message_enqueue_timeкоторый показывает, сколько времени сообщение было в очереди.

Можно отключить обработку сообщений-ядов

Инструкции CREATE QUEUE и ALTER QUEUE теперь могут включать или отключать обработку сообщений, добавляя предложение POISON_MESSAGE_HANDLING (STATUS = ON | OFF). Теперь представление sys.service_queues каталога содержит столбец is_poison_message_handling_enabled , указывающий, включена ли или отключена отравляющее сообщение.

Поддержка группы доступности в Service Broker

Дополнительные сведения см. в статье Компонент Service Broker с группами доступности AlwaysOn (SQL Server).