|
1、引言
Microsoft 在SQL Server 2005引入了服務(wù)代理 (Service Broker 簡(jiǎn)稱SSB) 為技術(shù)支持代理設(shè)計(jì)模式和面向消息的中間件 (MOM) 的原則。Service Broker在SQL Server 2008上得到完善, SQL Server Service Broker 為消息和隊(duì)列應(yīng)用程序提供 SQL Server 數(shù)據(jù)庫引擎本機(jī)支持。
這使開發(fā)人員可以輕松地創(chuàng)建使用數(shù)據(jù)庫引擎組件在完全不同的數(shù)據(jù)庫之間進(jìn)行通信的復(fù)雜應(yīng)用程序。開發(fā)人員可以使用 Service Broker 輕松生成可靠的分布式應(yīng)用程序。使用 Service Broker 的應(yīng)用程序開發(fā)人員無需編寫復(fù)雜的內(nèi)部通信和消息,即可跨多個(gè)數(shù)據(jù)庫分發(fā)數(shù)據(jù)工作負(fù)荷。因?yàn)?Service Broker 會(huì)處理會(huì)話上下文中的通信路徑,所以這就減少了開發(fā)和測(cè)試工作。同時(shí)還提高了性能。
企業(yè)系統(tǒng)和網(wǎng)站系統(tǒng)都需要處理大量的郵件、短信等消息通知系統(tǒng)。在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí),除了對(duì)安全、事務(wù)等問題給與足夠的重視外,性能也是一個(gè)不可避免的問題所在,必須充分地考慮訪問量、數(shù)據(jù)流量、服務(wù)器負(fù)荷的問題。解決性能的瓶頸,除了對(duì)硬件系統(tǒng)進(jìn)行升級(jí)外,軟件設(shè)計(jì)的合理性尤為重要。對(duì)于一些實(shí)時(shí)性不是很高的模塊我們可以使用了消息隊(duì)列技術(shù)來完成異步處理,利用消息隊(duì)列臨時(shí)存放要操作的數(shù)據(jù),將隊(duì)列的數(shù)據(jù)進(jìn)行異步的處理。本文基于SQL Server 2008 Service Broker、WCF、Windows 服務(wù)以及調(diào)度框架Quartz.NET實(shí)現(xiàn)一個(gè)消息通知系統(tǒng)。
2、消息隊(duì)列
2.1 隊(duì)列在異步運(yùn)作的架構(gòu)中是非常常用的數(shù)據(jù)結(jié)構(gòu)
基于消息的應(yīng)用程序的工作方式是提交一條消息,應(yīng)用程序執(zhí)行其工作。然后,再檢查看是否收到確認(rèn)消息已得到處理的信息。如果你的應(yīng)用程序充滿了待處理的請(qǐng)求,通常應(yīng)該增加另外一條處理隊(duì)列來緩解系統(tǒng)的總體處理壓力。
微軟消息隊(duì)列(MSMQ)提供一個(gè)開發(fā)這類應(yīng)用程序的框架。它使得應(yīng)用程序可以在不同種類的網(wǎng)絡(luò)間進(jìn)行通信,并且需要保證消息傳送(guaranteed message delivery)、路由和可配置安全。過去20年來,我們對(duì)關(guān)系數(shù)據(jù)庫系統(tǒng)的依賴程度顯著增加。最初,存儲(chǔ)數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行某種處理,是建立商業(yè)關(guān)系數(shù)據(jù)庫系統(tǒng)的主要目的。隨著關(guān)系數(shù)據(jù)庫系統(tǒng)的發(fā)展,其功能和復(fù)雜性的變化,它的主要用途已由單一數(shù)據(jù)存儲(chǔ)轉(zhuǎn)變?yōu)楦又髁鞯纳虡I(yè)智能目的、更加復(fù)雜的ETL處理、數(shù)據(jù)報(bào)告、數(shù)據(jù)通知;微軟認(rèn)為,允許你在數(shù)據(jù)庫內(nèi)建立基于消息的應(yīng)用程序,這樣才有意義。
Service Broker是SQL Server 2005中新添加的基礎(chǔ)程序,在SQL Server 2008上得到加強(qiáng),主要用于在數(shù)據(jù)庫引擎內(nèi)建立基于消息的應(yīng)用程序。SQL Server Service Broker是以數(shù)據(jù)表來實(shí)現(xiàn)隊(duì)列,并提供標(biāo)準(zhǔn)的T-SQL操作方式,讓系統(tǒng)設(shè)計(jì)人員可以善用消息溝通的特色設(shè)計(jì)應(yīng)用程序。Service Broker應(yīng)用程序以松散連接的應(yīng)用程序而開發(fā),它具有高度可擴(kuò)展性,并提供其它消息平臺(tái)所不具備的功能,如消息組協(xié)調(diào)和鎖定。這些應(yīng)用程序充分支持事務(wù),并能夠跨越數(shù)據(jù)庫實(shí)例和服務(wù)器。SQL Server 2008 Service Broker支持的消息可以達(dá)到2G,支持SQL的varbinary 和varbinary(max)數(shù)據(jù)類型,支持消息優(yōu)先級(jí),而且“饑餓機(jī)制”保障較低優(yōu)先級(jí)的消息也有機(jī)會(huì)獲得發(fā)送。
2.2 消息系統(tǒng)架構(gòu)
消息的整體架構(gòu)上分為三部分,消息系統(tǒng)客戶端,消息隊(duì)列系統(tǒng),消息隊(duì)列發(fā)送程序,序列圖如下:
客戶端準(zhǔn)備好消息,通過消息客戶端接口發(fā)送到消息隊(duì)列系統(tǒng),消息隊(duì)列發(fā)送程序定時(shí)輪詢獲取消息進(jìn)行發(fā)送,發(fā) 送的過程中發(fā)生錯(cuò)誤重新放入隊(duì)列,發(fā)送成功的隊(duì)列歸檔到消息數(shù)據(jù)庫。以郵件發(fā)送為例在具體的實(shí)現(xiàn)的流程如下:
上述多個(gè)部分協(xié)作,共同完成消息的發(fā)送任務(wù),在本實(shí)現(xiàn)方案總共有六個(gè)部分,以下對(duì)這幾個(gè)部分進(jìn)行詳細(xì)描述。
1、消息體MessageBase
自定義消息體的好處很多,采用自己定義的格式可以節(jié)省通信的傳遞量等等,也是這個(gè)消息系統(tǒng)的消息合約。
上面圖中我們可以看到我們定義了3種常見的消息類型:郵件、短信和RTX(騰訊通RTX是騰訊公司推出的企業(yè)級(jí)即時(shí)通信平臺(tái)),可以根據(jù)需要靈活的擴(kuò)展企業(yè)消息的類型。
2、客戶端組件
客戶端組件負(fù)責(zé)驗(yàn)證消息和將消息輸入消息隊(duì)列系統(tǒng),為了支持在整個(gè)企業(yè)環(huán)境提供服務(wù),采用WCF方式發(fā)布,采用TCP和SOAP方式發(fā)布,TCP方式的客戶端通過.NET組件包發(fā)布,另外通過SOAP方式發(fā)布的標(biāo)準(zhǔn)Web Service支持其他跨平臺(tái)(C++/Java/php/Python/Ruby)的調(diào)用,同時(shí)為調(diào)用進(jìn)行服務(wù)的驗(yàn)證,需要使用消息服務(wù)的業(yè)務(wù)系統(tǒng)首先需要在系統(tǒng)中注冊(cè),獲得服務(wù)調(diào)用的appkey,通過SOAP Header進(jìn)行傳遞,服務(wù)端依據(jù)系統(tǒng)的注冊(cè)信息(appkey和注冊(cè)的系統(tǒng)服務(wù)器IP)進(jìn)行驗(yàn)證。
3、SQL Server 2008 Service Broker隊(duì)列系統(tǒng)
SQL Server 2008 Service Broker支持會(huì)話優(yōu)先級(jí),可以支持1到10的10個(gè)優(yōu)先級(jí),為目標(biāo)服務(wù)創(chuàng)建10個(gè)優(yōu)先級(jí),只有一個(gè)約定,但每個(gè)級(jí)別都有單獨(dú)的發(fā)起方服務(wù)。所有發(fā)起方服務(wù)都與一個(gè)中心目標(biāo)服務(wù)通信。在系統(tǒng)的中分配了高(8)中(5)低(2)三個(gè)優(yōu)先級(jí),消息也有一個(gè)優(yōu)先級(jí)高(1)中(0)低(-1),進(jìn)入消息系統(tǒng)的優(yōu)先級(jí)等于系統(tǒng)優(yōu)先級(jí)+消息優(yōu)先級(jí),這樣就使用了1-9優(yōu)先級(jí),10優(yōu)先級(jí)為系統(tǒng)保留優(yōu)先級(jí),這樣就可有效的利用Service Broker的優(yōu)先級(jí)和控制業(yè)務(wù)系統(tǒng)對(duì)消息優(yōu)先級(jí)的使用。
4、消息處理器
消息處理器從隊(duì)列中取出消息,進(jìn)行發(fā)送處理,發(fā)送失敗的消息重新放回隊(duì)列,并增加重試次數(shù)計(jì)數(shù),當(dāng)重試計(jì)數(shù)超過最大的重試次數(shù),進(jìn)行歸檔處理,發(fā)送成功的消息進(jìn)行歸檔處理。每個(gè)月的數(shù)據(jù)分表存儲(chǔ),避免數(shù)據(jù)量過大的系統(tǒng)性能損耗。
5、消息隊(duì)列調(diào)度器
消息隊(duì)列的調(diào)度采用Windows 服務(wù)承載,使用Quartz.NET進(jìn)行作業(yè)的調(diào)度。Quartz.NET是一個(gè)開源的作業(yè)調(diào)度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#寫成,項(xiàng)目地址是http://quartzNET.sourceforge.NET。它提供了巨大的靈活性而不犧牲簡(jiǎn)單性。你能夠用它來為執(zhí)行一個(gè)作業(yè)而創(chuàng)建簡(jiǎn)單的或復(fù)雜的調(diào)度。
它有很多特征,如:數(shù)據(jù)庫支持,集群,插件,支持cron-like表達(dá)式等等。 消息的處理器包裝成Quartz Job加入調(diào)度系統(tǒng)。通過添加一系列的消息發(fā)送Job來加強(qiáng)消息發(fā)送的擴(kuò)展性。Quartz.NET本身支持集群性部署,結(jié)合Service Broker的分布式架構(gòu)和Quartz的分布式部署就可以達(dá)到系統(tǒng)擴(kuò)展性。
NET技術(shù):基于SQL Server 2008 Service Broker構(gòu)建企業(yè)級(jí)消息系統(tǒng),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。