Service Broker实现发布-订阅(Publish-Subscribe)框架(1)
Service Broker实现发布-订阅(Publish-Subscribe)框架(1)
Service Broker 实现一套完整的发布-订阅方案,其中author 发送Service Broker Message(又称article)到发布者(Publisher)。发布者负责分发消息给不同的订阅者(Subscriber)。每一个订阅者通过订阅来接受特定的消息。
下图描述了这一个发布-订阅方案:
下面看看如何通过Service Broker功能来实现这一方案。
定义基础架构
实现author、发布者和不同的订阅者作为Service Broker服务。AuthorService通过与PublisherService开始一个新的会话(conversation)发送article消息。在AuthorService发送一个实际的article消息之前,它需要事先通知PublisherService在会话中article的主体(Subject)。
订阅者也是Service Broker服务,它将与PublisherService进行会话。订阅者首先发送请求感兴趣的主题,随后接受所有关于这一主题的已发布的article消息。因为这些要求,PublisherService接口需要支持如下2个contracts:
l author服务发送article消息的contract
l 订阅者订阅主题和接收已发布article消息的contract
下面定义了相关的Service Broker对象。
消息类型Message Type
CREATE MESSAGE TYPE [http://ssb.csharp.at/SSB_Book/c10/PublishMessage]
VALIDATION = WELL_FORMED_XML;
GO
CREATE MESSAGE TYPE [http://ssb.csharp.at/SSB_Book/c10/ArticleMessage]
VALIDATION = NONE;
GO
CREATE MESSAGE TYPE [http://ssb.csharp.at/SSB_Book/c10/SubscribeMessage]
VALIDATION = WELL_FORMED_XML;
GO
契约Contract
CREATE CONTRACT [http://ssb.csharp.at/SSB_Book/c10/PublishContract]
(
[http://ssb.csharp.at/SSB_Book/c10/PublishMessage] SENT BY INITIATOR,
[http://ssb.csharp.at/SSB_Book/c10/ArticleMessage] SENT BY INITIATOR
)
GO
CREATE CONTRACT [http://ssb.csharp.at/SSB_Book/c10/SubscribeContract]
(
[http://ssb.csharp.at/SSB_Book/c10/SubscribeMessage] SENT BY INITIATOR,
[http://ssb.csharp.at/SSB_Book/c10/ArticleMessage] SENT BY TARGET
)
GO
队列 QUEUE 和 服务 SERVICE
发布者队列及其服务
CREATE QUEUE [PublisherQueue]
GO
CREATE SERVICE [PublisherService] ON QUEUE [PublisherQueue]
(
[http://ssb.csharp.at/SSB_Book/c10/PublishContract],
[http://ssb.csharp.at/SSB_Book/c10/SubscribeContract]
)
GO
订阅者队列及其服务
CREATE QUEUE SubscriberQueue1;
GO
CREATE SERVICE SubscriberService1 ON QUEUE SubscriberQueue1;
GO
CREATE QUEUE SubscriberQueue2;
GO
CREATE SERVICE SubscriberService2 ON QUEUE SubscriberQueue2;
GO
Author队列及其服务
CREATE QUEUE AuthorQueue;
GO
CREATE SERVICE AuthorService ON QUEUE AuthorQueue;
GO
在创建好上述Service Broker基础架构后,下面创建2个表,分别用来存储发布和订阅记录。针对本示例,我们分别创建如下2个表:Publications和Subscriptions。(EntLib.com译者注:Publications 表需要分别在Author和Publisher端创建;Subscriptions表需要分别在Publisher和Subscriber端创建。)
CREATE TABLE Publications
(
Publication UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
Subject NVARCHAR(MAX) NOT NULL,
OriginalXml XML NOT NULL
)
GO
CREATE TABLE Subscriptions
(
Subscriber UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
Subject NVARCHAR(MAX) NOT NULL,
OriginalXml XML NOT NULL
)
GO
通过这2个表,我们可以匹配来自AuthorService的article消息和订阅者。通过Subject列来连接这2个表,后面的“发布者逻辑”中具体介绍。下面看看PublisherService端运行的服务程序。
EntLib.com译者注:本文翻译Apress出版《Pro SQL Server 2005 Service Broker》的其中一个章节。后面的内容会尽快发布,欢迎交流、分享。谢谢!