Продолжается подписка на наши издания! Вы не забыли подписаться?

Программируем Service Broker в SQL Server 2005

Автор: Роджер Дженнингс (Roger Jennings)
Опубликовано: 02.11.2006

Service Broker (SSB), новый компонент SQL Server 2005, интегрирует асинхронное программирование, очереди и надежный обмен сообщениями с СУБД.

SSB-приложения могут обмениваться сообщениями с конечными точками сервисов, такими, как экземпляры серверов, базы данных и клиенты .NET 2.0. Наиболее распространенный формат сообщений – Unicode-строки, содержащие корректный XML-документ, который SSB отправляет и получает через пару очередей сообщений как родной тип данных SQL Server 2005.

Сообщения могут также использовать типы данных varbinary или varbinary(max). В каждом случае максимальный размер SSB-сообщения – 2 GB (один миллиард Unicode-символов). Многие VS 2005-проекты, интенсивно работающие с данными, используют собственные SQL Server для управления очередями сообщений, хранящимися в таблицах. Создание ADO.NET-кода или хранимых процедур на T-SQL для эффективного управления очередями – устрашающая задача, особенно для конечных точек (end point) нескольких удаленных БД; тестирование таких проектов - еще более сложная задача. SSB предоставляет полную асинхронную инфраструктуру обмена сообщениями, устанавливаемую и управляемую при помощи базового набора T-SQL-выражений.

Service Broker также предоставляет инфраструктуру, лежащую в основе новых возможностей - Event Notifications, Query Notifications и Database Mail (Database Mail заменяет SQL Mail, использовавшийся в SQL Server 2000 и ранее). Скорее всего, вы впервые встретитесь с SSB при попытке реализовать одну из этих трех возможностей. Понимание работы с сообщениями в Database Engine важно при создании и отладке любого SSB-приложения.

Я начну с краткого описания возможностей SSB и демонстрации простого сценария обмена сообщениями с помощью T-SQL-скриптов, приведенных в примере кода, сопровождающем статью. Затем я покажу как использовать Service Broker для реализации уведомлений о запросах, также известных, как оповещения об изменениях в БД (DCN, см. Дополнительные ресурсы). DCN сейчас является наиболее распространенным Service Broker-приложением, поскольку позволяет Web-разработчикам обновлять кэш страниц ASP.NET 2.0 с оптимальным интервалом, для гарантии корректности данных. Я покажу также, как реализуются оповещения о событиях.

Пример кода включает проекты для SQL Server Management Studio (SSMS), демонстрирующие простое и сложное SSB-приложения, Query Notifications, Event Notifications и Database Mail. Для запуска большинства примеров вам потребуется SQL Server 2005 Developer Edition или выше, так как SQL Server Express (SSX) включает только клиентские компоненты SSB. В SSX также отсутствует поддержка Database Mail. SSB-клиент получает или отправляет сообщения только через более старшие версии SQL Server 2005. Вместе с тем, SSX поддерживает Query Notifications.

Сервисно-ориентированная архитектура (SOA) использует асинхронный обмен сообщениями для поддержки слабосвязанных приложений, поэтому Microsoft предлагает SSB в качестве инфраструктуры для сервисно-ориентированной архитектуры БД (Service-Oriented Database Architecture, SODA). Подход SODA напоминает Windows Communication Foundation (WCF, ранее Indigo), Microsoft Message Queue (MSMQ) и приложения BizTalk Server. Вы можете использовать SODA для управления потоками данных с помощью экземпляров хранимых процедур, которые активируются при получении первого из одного или более сообщений, а затем обрабатывают каждый набор связанных сообщений в отдельной транзакции. Активация нескольких экземпляров хранимых процедур обеспечивает масштабирование по мере роста трафика сообщений; один экземпляр может работать только с таким количеством сообщений, которое не вызывает ухудшения производительности.

Внутри приложения Service Broker

Service Broker-приложение включает три основные группы компонентов:

Очереди-FIFO обеспечивают хранение сообщений в скрытых таблицах, запрещающих SSB-приложениям операции INSERT и DELETE, но поддерживающих традиционные SELECT-запросы. SSB предлагает проверку корректности XML-сообщений и их соответствия XML-схеме, которую вы добавляете к XML SCHEMA COLLECTION вашей БД.

По умолчанию при создании БД Service Broker выключен, и чтобы использовать его, для каждой БД нужно выполнить команду ALTER DATABASE DBName SET ENABLE_BROKER. Включение SSB командой ALTER DATABASE требует эксклюзивного доступа к БД DBName. Заметьте, что наличие любого другого подключения к БД помешает исполнению команды и остановит выполнение скрипта. Вы можете экстренно прервать сессии других подключений немедленно или через некоторое время с помощью опции отключения: WITH ROLLBACK {IMMEDIATE | AFTER int [SECONDS]}. Прекратить исполнение команды в случае наличия открытого подключения можно, указав опцию NO_WAIT.


Рисунок 1.

Установка Service Broker для одного экземпляра SQL Server 2005 требует исполнения T-SQL-выражений, создающих объекты БД MESSAGE TYPE, CONTRACT, QUEUE и SERVICE для инициализации конечной точки сервиса. Целевые конечные точки в одной БД разделяют объекты MESSAGE TYPE и CONTRACT, но требуют собственных объектов QUEUE и SERVICE (см. рисунок 1 и листинг 1). Для большинства объектов в SSMS есть простые шаблоны. К сожалению, шаблоны не содержат полного синтаксиса CREATE SSBOBJECT, задающего значения по умолчанию и показывающего доступные опции для SSB-объектов. Возможно, писать SSB-код «с нуля» быстрее, чем изменять довольно запутанные шаблоны.

Листинг 1.

USE Northwind;
GO
ALTER DATABASE Northwind SET ENABLE_BROKER 
   WITH ROLLBACK AFTER 5 SECONDS;
GO
CREATE MESSAGE TYPE NwindXmlMessage 
   VALIDATION = WELL_FORMED_XML; 
GO
CREATE CONTRACT NwindContract (NwindXmlMessage 
   SENT BY INITIATOR);
GO
CREATE QUEUE dbo.NwindInitiatorQueue;
GO
CREATE SERVICE NwindInitiatorService 
   ON QUEUE dbo.NwindInitiatorQueue;
GO
CREATE QUEUE dbo.NwindTargetQueue;
GO
CREATE SERVICE NwindTargetService 
   ON QUEUE dbo.NwindTargetQueue (NwindContract);

Листинг 2

USE Northwind; 
GO
BEGIN TRANSACTION; 
GO
DECLARE @MessageXML XML;
SET @MessageXML = N'Message from the 
   Northwind database';
DECLARE @conversation_id UNIQUEIDENTIFIER;
BEGIN DIALOG CONVERSATION @conversation_id
   FROM SERVICE NwindInitiatorService
   TO SERVICE 'NwindTargetService'
   ON CONTRACT NwindContract
   WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @conversation_id MESSAGE TYPE 
   NwindXmlMessage(@MessageXML);
END CONVERSATION @conversation_id;
GO
COMMIT TRANSACTION;
GO
SELECT * FROM dbo.NwindTargetQueue;
GO

Листинг 3.

USE Northwind;
GO
WHILE (1 = 1)
BEGIN 
   DECLARE @conversation_handle UNIQUEIDENTIFIER,
      @conversation_group_id UNIQUEIDENTIFIER,
      @message_body XML,
      @message_type_name NVARCHAR(128);
   BEGIN TRANSACTION;
   WAITFOR(GET CONVERSATION GROUP 
      @conversation_group_id FROM dbo.NwindTargetQueue),
      TIMEOUT 500;
   IF @conversation_group_id IS NULL
   BEGIN
      ROLLBACK TRANSACTION;
      BREAK;
   END;
   WHILE (1 = 1)
   BEGIN
      RECEIVE TOP(1)
         @conversation_handle = conversation_handle,
         @message_type_name = message_type_name,
         @message_body = CAST(message_body AS XML)
      FROM dbo.NwindTargetQueue
      WHERE conversation_group_id = 
         @conversation_group_id;
      IF @@ROWCOUNT = 0 OR @@ERROR <> 0 BREAK;
      SELECT 'Conversation Group Id' = 
         @conversation_group_id,
          'Conversation Handle' = @conversation_handle,
          'Message Type Name' = @message_type_name,
          'Message Body' = @message_body;
      IF @message_type_name = 
'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
         OR @message_type_name = 
'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
      BEGIN
         END CONVERSATION @conversation_handle;
      END;
   END;
   COMMIT TRANSACTION;
END;

Вы должны задать разрешение GRANT CREATE на все SSB-объекты пользователям, которым потребуется создавать объекты, если эти пользователи не являются членами ролей sysadmin, ddl_admin или db_owner. Разработка промышленных SSB-проектов требует определения существенного числа объектов, так что DBA, как правило, исполняют SQL-скрипты для создания приложений сервисов. Пользователям с меньшими привилегиями обычно требуется разрешения CREATE SCHEMA, VIEW DEFINITION для связанных SSB-объектов, REFERENCES для CONTRACT, SEND на инициаторе целевого SERVICE-а, а также QUEUE и RECEIVE на целевых QUEUE.

Простые тестовые примеры

<...>

«Слабосвязанный» и «сервис-ориентированный» конкурируют с «Web 2.0» и «пользовательский контент» за звание «самых используемых бессмысленных слов современности». Но SSB, Query Notifications, Event Notifications и Database Mail предоставляют инструменты, необходимые, чтобы перенести множество БД-проектов в новый мир асинхронного обмена сообщениями без участия Windows Communication Foundation.

........................
"С полным содержанием данной статьи можно ознакомиться в печатной версии журнала"

Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

Copyright © 1994-2016 ООО "К-Пресс"