Технология Клиент-Сервер 2006'3 |
|||||||
|
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-приложение включает три основные группы компонентов:
Очереди-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.
Установка Service Broker для одного экземпляра SQL Server 2005 требует исполнения T-SQL-выражений, создающих объекты БД MESSAGE TYPE, CONTRACT, QUEUE и SERVICE для инициализации конечной точки сервиса. Целевые конечные точки в одной БД разделяют объекты MESSAGE TYPE и CONTRACT, но требуют собственных объектов QUEUE и SERVICE (см. рисунок 1 и листинг 1). Для большинства объектов в SSMS есть простые шаблоны. К сожалению, шаблоны не содержат полного синтаксиса CREATE SSBOBJECT, задающего значения по умолчанию и показывающего доступные опции для SSB-объектов. Возможно, писать SSB-код «с нуля» быстрее, чем изменять довольно запутанные шаблоны.
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); |
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 |
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 ООО "К-Пресс"