Service Broker

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

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

Когда следует использовать компонент 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]);

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

Сообщения отправляются в диалоге между службами с помощью инструкции SEND Transact-SQL. Диалог — канал связи, который устанавливается между службами с помощью инструкции 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 не изменяет очередь и удаляет сообщения. Для чтения и извлечения сообщений из очереди можно использовать инструкцию RECEIVE 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

После обработки всех сообщений из очереди следует закрыть беседу с помощью END CONVERSATION инструкции Transact-SQL.

-- 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

Межэкземплярный обмен сообщениями Service Broker между экземплярами Управляемый экземпляр 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).