SQL Server 2008中SQL應(yīng)用系列--目錄索引
導(dǎo)讀:本文主要涉及Service Broker的基本概念及建立一個(gè)Service Broker應(yīng)用程序的基本步驟。
一、前言 :
Service Broker為SQL Server提供消息隊(duì)列,這提供了從數(shù)據(jù)庫中發(fā)送異步事務(wù)性消息隊(duì)列的方法。Service Broker消息可以保證以適當(dāng)?shù)捻樞蚧蛟嫉陌l(fā)送順序不重復(fù)地一次性接收。并且因?yàn)閮?nèi)建在SQL Server中,這些消息在數(shù)據(jù)庫發(fā)生故障時(shí)是可以恢復(fù)的,也可以隨數(shù)據(jù)庫一起備份。在SQL Server 2008中,還引入了使用Create Broker Priority命令對會(huì)話設(shè)定優(yōu)先級,可以對重要的或不重要的會(huì)話進(jìn)行優(yōu)先級設(shè)定,以保證消息合理地處理。
本文假定一個(gè)在線數(shù)據(jù)庫BookStore中存儲(chǔ)了一些業(yè)務(wù)訂單。我們使用Service Broker應(yīng)用程序?qū)⑾l(fā)送到另一個(gè)數(shù)據(jù)庫BookDistribution,該數(shù)據(jù)庫是分離的應(yīng)用程序調(diào)用,該應(yīng)用程序控制倉庫入庫和出庫交付, 并返回消息給BookStore。
創(chuàng)建Service Broker應(yīng)用程序大體步驟如下:
1、定義希望應(yīng)用程序執(zhí)行的異步任務(wù)。
2、確定Service Broker的發(fā)起方服務(wù)和目標(biāo)服務(wù)是否創(chuàng)建在同一個(gè)SQL Server實(shí)例中。如果是兩個(gè)實(shí)例,實(shí)例間的通信還需要?jiǎng)?chuàng)建經(jīng)過證書認(rèn)證或NT安全的身份認(rèn)證,并且要?jiǎng)?chuàng)建端點(diǎn)、路由以及對話安全模式。
3、如果沒有啟用,則在多方參與的數(shù)據(jù)庫中使用Alter Database命令設(shè)置Enable_broker以及Truseworthy數(shù)據(jù)庫選項(xiàng)。
4、為所有多方參與的數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫主密鑰。
5、創(chuàng)建希望在服務(wù)之間發(fā)送的消息類型。
6、創(chuàng)建契約(Contract)來定義可以由發(fā)起方發(fā)送的各種消息以及由目標(biāo)發(fā)送的消息類型的種類。
7、同時(shí)在兩方參與的數(shù)據(jù)庫中創(chuàng)建用于保存消息的隊(duì)列。
8、同時(shí)在綁定特定約定到特定隊(duì)列的多方參與的數(shù)據(jù)庫中創(chuàng)建服務(wù)。
二、實(shí)例
下面我們通過一個(gè)示例來實(shí)現(xiàn)以上步驟:
(一)、啟用數(shù)據(jù)庫的Service Broker活動(dòng)
(二)、創(chuàng)建數(shù)據(jù)庫主密鑰
(三)、管理消息類型
使用CREATE MESSAGE TYPE( http://msdn.microsoft.com/en-us/library/ms187744.aspx )命令,
--注意,此處沒有定義消息的內(nèi)容。實(shí)際的消息是消息類型的實(shí)例。
(四)、創(chuàng)建契約(Contract)
使用Create Contract( http://msdn.microsoft.com/en-us/library/ms178528.aspx )
--發(fā)起方和目標(biāo)的定義必須相同
(五)、創(chuàng)建隊(duì)列
隊(duì)列用來保存數(shù)據(jù)。使用命令Create queue( http://msdn.microsoft.com/en-us/library/ms190495.aspx )
(六)、創(chuàng)建服務(wù)
服務(wù)定義端點(diǎn),然后使用它來將消息隊(duì)列綁定到一個(gè)或多個(gè)契約上。服務(wù)使用隊(duì)列和契約來定義一個(gè)或一組任務(wù)。有點(diǎn)拗口,是不是?
服務(wù)是消息的發(fā)起方和接收方強(qiáng)制約定的規(guī)則,并將消息路由到正確的序列。
使用Create Service( http://msdn.microsoft.com/en-us/library/ms190332.aspx )命令。
(七)、啟動(dòng)對話
對話會(huì)話(dialog conservation)是在服務(wù)之間進(jìn)行消息交換的操作。
使用Begin Dialog Conversation( http://msdn.microsoft.com/en-us/library/ms187377.aspx ) 命令創(chuàng)建新的會(huì)話。使用Send( http://msdn.microsoft.com/en-us/library/ms188407.aspx )來發(fā)送消息。使用End Conversation命令( http://msdn.microsoft.com/en-us/library/ms177521.aspx )結(jié)束會(huì)話。
(八)、查詢隊(duì)列中傳入的消息
查詢結(jié)果:
(九)、檢索并響應(yīng)消息
使用Receive語句( http://msdn.microsoft.com/en-us/library/ms186963.aspx )從隊(duì)列中讀取行(消息),也可以刪除已經(jīng)讀取的消息。Receive的結(jié)果可以填充到常規(guī)表中,也可以在局部變量中執(zhí)行其他操作,或發(fā)送到其他service Broker消息。如果消息是XML數(shù)據(jù)類型的消息,則可以直接借助TSQL的XQuery來操作。
(十)、結(jié)束會(huì)話
三、小結(jié)
本文通過一個(gè)實(shí)例演示了一個(gè)用來發(fā)送圖書訂單消息分發(fā)控制數(shù)據(jù)庫的簡單的消息交換應(yīng)用程序。發(fā)起方發(fā)送圖書訂單,發(fā)回一個(gè)響應(yīng),并在兩個(gè)數(shù)據(jù)庫上使用END Conservation結(jié)束會(huì)話。現(xiàn)實(shí)場景中可以轉(zhuǎn)換為其他消息類型、契約、服務(wù)和隊(duì)列。合理運(yùn)用Service Broker應(yīng)用程序的異步特性可以防止因應(yīng)用程序掛起而導(dǎo)致業(yè)務(wù)系統(tǒng)產(chǎn)生瓶頸。
本文參考:
1、SQL Server 2005 Service Broker 初探
http://msdn.microsoft.com/zh-cn/library/ms345108%28v=sql.90%29.aspx
2、SQL Server 2008 Transact-SQL Recipes: A Problem-Solution Approach
http://www.amazon.com/Server-2008-Transact-SQL-Recipes-Problem-Solution/dp/1590599802
助人等于自助! 3w@live.cn
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
