1. Архитектура Service Broker и ключевые понятия
Архитектура Service Broker и ключевые понятия
Service Broker (SB) — встроенный в Microsoft SQL Server механизм асинхронного обмена сообщениями и построения надёжных очередей внутри SQL Server и между экземплярами SQL Server. Его часто используют для фоновой обработки, интеграции модулей, разгрузки онлайн-транзакций, построения событийных процессов.
В этой статье мы разберём архитектуру Service Broker и термины, без которых невозможно уверенно читать документацию и проектировать решения на SB.
> Service Broker is a feature that provides native support for messaging and queuing in the Microsoft SQL Server Database Engine. — Microsoft Learn, раздел про Service Broker Service Broker
Когда Service Broker уместен
Service Broker решает задачи, где важны надёжность и развязка по времени между производителем и потребителем.
Маркерные сценарии:
Ограничения, которые важно знать заранее:
Общая архитектура: из каких слоёв состоит Service Broker
В Service Broker удобно мыслить слоями: модель сообщений → диалоги → хранение и доставка → обработка.
!Общая карта объектов и поток сообщения от отправителя к получателю
Ключевая идея: приложение не пишет напрямую в очередь получателя. Оно отправляет сообщение в рамках диалога между сервисами, а Service Broker гарантирует доставку и порядок в пределах диалога.
Базовые сущности Service Broker
Ниже — «словарь» объектов. Эти сущности создаются DDL-командами и существуют как объекты базы данных.
Сообщение
Сообщение — единица данных, которая передаётся между сервисами.
Что важно:
Тип сообщения (Message Type)
Message Type задаёт правила валидации тела сообщения.
Популярные варианты:
WELL_FORMED_XML — сообщение должно быть корректным XML.NONE — без валидации (быстрее, но контроль на приложении).Документация: CREATE MESSAGE TYPE
Контракт (Contract)
Contract описывает, какие типы сообщений разрешены в диалоге и кто имеет право их отправлять.
Почему это важно:
Документация: CREATE CONTRACT
Очередь (Queue)
Queue — хранилище сообщений в базе данных. Физически это внутренний объект, но работать с ним можно через RECEIVE.
Свойства очереди, которые нужно помнить:
Документация: CREATE QUEUE
Сервис (Service)
Service — логическая конечная точка SB в базе данных. Сервис привязан к одной очереди и набору контрактов, которые он поддерживает.
Интуитивная модель:
Документация: CREATE SERVICE
Диалог (Conversation)
Conversation — долгоживущий двусторонний канал между двумя сервисами в рамках конкретного контракта.
Свойства диалога:
conversation_handle.Технически диалог живёт в системном состоянии (например, в представлениях sys.conversation_endpoints).
Документация: BEGIN DIALOG CONVERSATION
Конечные системные сообщения
Service Broker использует два стандартных сообщения, которые встречаются почти в каждом решении:
Эти сообщения нужно обрабатывать, иначе диалоги будут «зависать».
Как сообщение проходит путь от отправителя к получателю
Полезно запомнить цепочку действий на концептуальном уровне.
BEGIN DIALOG CONVERSATION.SEND ON CONVERSATION.RECEIVE (обычно в транзакции).END CONVERSATION.Документация: SEND, RECEIVE, END CONVERSATION
Надёжность и транзакционность: почему SB не «теряет» сообщения
Service Broker тесно интегрирован с транзакциями SQL Server.
Практическая интерпретация:
RECEIVE) тоже транзакционно: если обработчик упал и транзакция откатилась, сообщение вернётся в очередь.Это основа паттерна exactly-once processing на уровне очереди при корректной логике обработчика.
Встроенная обработка: активация очереди (Activation)
Activation — механизм, при котором SQL Server сам запускает обработчики сообщений (хранимые процедуры) при появлении сообщений в очереди.
Зачем это нужно:
Ключевые элементы активации:
ACTIVATION (STATUS = ON, PROCEDURE_NAME = ..., MAX_QUEUE_READERS = N, EXECUTE AS ...) в настройках очереди.MAX_QUEUE_READERS управляет параллелизмом (сколько одновременных экземпляров обработчика может читать очередь).Документация: раздел про активацию в CREATE QUEUE
Маршрутизация и сетевое взаимодействие
Когда сервисы находятся в разных базах или на разных экземплярах SQL Server, в архитектуре появляются дополнительные сущности.
Маршрут (Route)
Route связывает имя удалённого сервиса с адресом доставки (куда отправлять сообщения).
Документация: CREATE ROUTE
Endpoint
Service Broker endpoint — сетевой слушатель, который принимает и отправляет SB-трафик между экземплярами.
Документация: CREATE ENDPOINT
Транспортная очередь (Transmission Queue)
Transmission queue — внутренняя очередь, где накапливаются сообщения, ожидающие отправки на удалённый сервис.
Зачем она важна при диагностике:
На практике её смотрят через системные представления и DMV (в следующих статьях курса мы разберём диагностику подробно).
Группы диалогов и конкуренция
Группа диалога (Conversation Group)
Conversation group — механизм, который позволяет обрабатывать связанные диалоги согласованно, не допуская параллельной обработки конфликтующих сообщений разными воркерами.
Практический смысл:
В обработчиках это проявляется через блокировки на группу при RECEIVE.
Безопасность: что защищается и чем
В Service Broker есть два уровня безопасности:
Минимальная практическая рекомендация:
Обзор: Security for Service Broker
Жизненный цикл диалога и утечки
Диалог — это состояние, которое нужно закрывать.
Типовые причины «утечек диалогов»:
EndDialog.END CONVERSATION на другой.Результат:
Команды завершения: END CONVERSATION
«Ядовитые» сообщения и повторные доставки
Если обработчик получает сообщение, падает и откатывает транзакцию, то сообщение вернётся в очередь и будет доставлено снова. Это правильно, но может превратиться в бесконечный цикл.
Такое сообщение часто называют poison message.
Что делают в зрелых решениях:
Минимальная карта объектов и где их наблюдать
В Service Broker полезно уметь быстро сопоставлять DDL-объекты и системные представления.
| Сущность | Создаётся чем | Где смотреть состояние/метаданные |
|---|---|---|
| Message Type | CREATE MESSAGE TYPE | sys.service_message_types |
| Contract | CREATE CONTRACT | sys.service_contracts |
| Queue | CREATE QUEUE | sys.service_queues |
| Service | CREATE SERVICE | sys.services |
| Route | CREATE ROUTE | sys.routes |
| Conversation endpoints | BEGIN DIALOG CONVERSATION (создаёт состояние) | sys.conversation_endpoints |
Справочник системных представлений: Service Broker Catalog Views
Подготовка базы: включён ли Broker
Service Broker включается на уровне базы данных. Если он выключен, многие операции будут завершаться ошибками или не дадут ожидаемого поведения.
Проверка и включение описаны в документации по ALTER DATABASE:
SET ENABLE_BROKERДокументация: ALTER DATABASE SET Options
Итоги
В Service Broker архитектура строится вокруг нескольких опорных идей:
В следующей статье логично перейти от терминов к скелету рабочей конфигурации: развернуть минимальный локальный пример (message type → contract → queue → service), отправить сообщения и разобрать, как писать обработчик с RECEIVE и корректным завершением диалогов.