导读:本文主要涉及Service Broker的基本概念及建立一个Service Broker应用程序的基本步骤。
一、前言:
Service Broker为SQL Server提供消息队列,这提供了从数据库中发送异步事务性消息队列的方法。Service Broker消息可以保证以适当的顺序或原始的发送顺序不重复地一次性接收。并且因为内建在SQL Server中,这些消息在数据库发生故障时是可以恢复的,也可以随数据库一起备份。在SQL Server 2008中,还引入了使用Create Broker Priority命令对会话设定优先级,可以对重要的或不重要的会话进行优先级设定,以保证消息合理地处理。
本文假定一个在线数据库BookStore中存储了一些业务订单。我们使用Service Broker应用程序将消息发送到另一个数据库BookDistribution,该数据库是分离的应用程序调用,该应用程序控制仓库入库和出库交付, 并返回消息给BookStore。
创建Service Broker应用程序大体步骤如下:
1、定义希望应用程序执行的异步任务。
2、确定Service Broker的发起方服务和目标服务是否创建在同一个SQL Server实例中。假如是两个实例,实例间的通信还需要创建经过证书认证或NT安全的身份认证,并且要创建端点、路由以及对话安全模式。
3、假如没有启用,则在多方参与的数据库中使用Alter Database命令设置Enable_broker以及Truseworthy数据库选项。
4、为所有多方参与的数据库创建数据库主密钥。
5、创建希望在服务之间发送的消息类型。
6、创建契约(Contract)来定义可以由发起方发送的各种消息以及由目标发送的消息类型的种类。
7、同时在两方参与的数据库中创建用于保存消息的队列。
8、同时在绑定特定约定到特定队列的多方参与的数据库中创建服务。
二、实例
下面我们通过一个示例来实现以上步骤:
(一)、启用数据库的Service Broker活动
-- Enabling Databases for Service Broker Activity
USE master
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'BookStore')
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'BookDistribution')
ALTER DATABASE BookStore SET ENABLE_BROKER
ALTER DATABASE BookStore SET TRUSTWORTHY ON
ALTER DATABASE BookDistribution SET ENABLE_BROKER
ALTER DATABASE BookDistribution SET TRUSTWORTHY ON
(二)、创建数据库主密钥
-- Creating the DatabaseMaster Key for Encryption
USE BookStore
CREATE MASTER KEY
GO
USE BookDistribution
CREATE MASTER KEY
GO
(三)、管理消息类型
使用CREATE MESSAGE TYPE(http://msdn.microsoft.com/en-us/library/ms187744.aspx)命令,
-- Managing Message Types
Use BookStore
-- 发送图书订单的消息类型
VALIDATION = WELL_FORMED_XML
CREATE MESSAGE TYPE [//SackConsulting/BookOrderReceived]
Use BookDistribution
-- 发送图书订单的消息类型
VALIDATION = WELL_FORMED_XML
CREATE MESSAGE TYPE [//SackConsulting/BookOrderReceived]
CREATE CONTRACT
( [//SackConsulting/SendBookOrder]
SENT BY TARGET
CREATE CONTRACT
( [//SackConsulting/SendBookOrder]
SENT BY TARGET
--保存BookDistribution过来的消息
GO
USE BookDistribution
--保存BookStore过来的消息
GO
(六)、创建服务
服务定义端点,然后使用它来将消息队列绑定到一个或多个契约上。服务使用队列和契约来定义一个或一组任务。有点拗口,是不是?
服务是消息的发起方和接收方强制约定的规则,并将消息路由到正确的序列。
使用Create Service(http://msdn.microsoft.com/en-us/library/ms190332.aspx)命令。
-- Creating Services
Use BookStore
CREATE SERVICE [//SackConsulting/BookOrderService]
([//SackConsulting/BookOrderContract])
CREATE SERVICE [//SackConsulting/BookDistributionService]
([//SackConsulting/BookOrderContract])
DECLARE @Conv_Handler uniqueidentifier
BEGIN DIALOG CONVERSATION @Conv_Handler--创建会话
TO SERVICE '//SackConsulting/BookDistributionService'
'<order id="3439" customer="22" orderdate="2/15/2011">
MESSAGE TYPE [//SackConsulting/SendBookOrder]
SELECT message_type_name, CAST(message_body as xml) message,
--创建一个表存放接收到的订单信息
DECLARE @Conv_Handler uniqueidentifier
DECLARE @OrderMsg xml
--从队列中获取消息,将接收值赋于局部变量
@Conv_Handler = conversation_handle,
-- 将变量值插入表中
(@Conv_Handler,@Conv_Group, @OrderMsg )
-- 使用XQuery进行抽取以响应消息订单
'<orderreceived id= "' +
'"/>';
-- 使用既有的会话句柄,发送响应消息到发起方
MESSAGE TYPE [//SackConsulting/BookOrderReceived]
(十)、结束会话
-- Ending a Conversation
USE BookStore
-- 创建订单确认表
DECLARE @Conv_Handler uniqueidentifier
DECLARE @OrderMsg xml
RECEIVE TOP(1) @Conv_Handler = conversation_handle,
INSERT dbo.BookOrderConfirmation
END CONVERSATION @Conv_Handler;
DECLARE @Conv_Handler uniqueidentifier
DECLARE @OrderMsg xml
RECEIVE TOP(1) @Conv_Handler = conversation_handle,
-- 双方必须都结束会话
@message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
END CONVERSATION @Conv_Handler;
END
--查询会话状态
SELECT state_desc, conversation_handle
FROM sys.conversation_endpoints
三、小结
本文通过一个实例演示了一个用来发送图书订单消息分发控制数据库的简单的消息交换应用程序。发起方发送图书订单,发回一个响应,并在两个数据库上使用END Conservation结束会话。现实场景中可以转换为其他消息类型、契约、服务和队列。合理运用Service Broker应用程序的异步特性可以防止因应用程序挂起而导致业务系统产生瓶颈。
原文链接:http://www.cnblogs.com/downmoon/archive/2011/04/05/2005900.html