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