WCF筆記--MSMQ的使用

好久好久沒有寫過日誌了,,多是遺忘了,也多是明白了些什麼..
 
趁着此次工做的機會算是把WCF進行了完整再學習,其中一些不足的遺忘的點都零零碎碎的拼接在了一塊兒
爲避免再次遺失,仍是記錄以下...




1、爲何要使用MSMQ

在一個分佈式的環境中,咱們每每須要根據具體的狀況採用不一樣的方式進行數據的傳輸。好比在一個Intranet內,咱們通常經過TCP進行高效的數據通訊;而在一個Internet的環境中,咱們則一般使用Http進行跨平臺的數據交換。而這些通訊方式具備一個顯著的特色,那就是他們是基於Connection的,也就是說,交互雙方在進行通訊的時候必須保證有一個可用的Connection存在於他們之間。而在某些時候,好比那些使用撥號鏈接的用戶、以及使用便攜式計算機的用戶,咱們不能保證在他們和須要訪問的Server之間有一個的可靠的鏈接,在這種狀況下,基於Messaging Queue的鏈接就顯得尤其重要了。咱們今天就來談談在WCF中如何使用MSMQ。
MSMQ不只僅是做爲支持客戶端鏈接工具而存在,合理的使用MSMQ能夠在很大程度上提高系統的Performance和Scalability。咱們先來看看MSMQ能給咱們帶來怎樣的好處:
1.MSMQ是基於Disconnection
MSMQ經過Message Queue進行通訊,這種通訊方式爲 離線工做 成爲了可能。好比在介紹MSMQ時都會提到的Order Delivery的例子:在一個基於B2C的系統中,訂單從各類各樣的客戶傳來,因爲 客戶的各異性,不能保證每一個客戶在每時每刻都和用於接收訂單的Server保持一個可靠的鏈接,咱們有時候甚至容許客戶即便在 離線 的狀況下也能夠遞交訂單(雖然訂單不能發送到訂單的接收方,可是咱們能夠經過某種機制保證先在本地保存該訂單,一旦鏈接創建,則立刻向接收方遞交訂單),而MSMQ則有效地提供了這樣的機制:Server端創建一個Message Queue來接收來個客戶的訂單,客戶端經過向該Message Queue發送承載了訂單數據的Message實現訂單的遞交。若是在客戶離線的狀況下,他仍然能夠經過客戶端程序進行訂單遞交的操做,存儲着訂單數據的Message會被暫時保存在本地的Message Queue中,一旦客戶聯機,MSMQ將Message從中取出,發送到真正的接收方,而這個動做對於用戶的透明的。
2.MSMQ天生是One-way、異步的
在MSMQ中,Message始終以One-way的方式進行發送,因此MSMQ具備天生的異步特性。因此MSMQ使用於那些對於用戶的請求,Server端 無需當即響應 的場景。也就是說Server 對數據的處理無需和Client的數據的發送進行同步 ,它能夠獨自地按照本身的Schedule進行工做。這能夠避免峯值負載。好比Server端能夠在一個相對低負載的時段(好比深夜)來對接收到的Order進行批處理,而無需一天24小時一直進行Order的監聽、接收和處理。
3.MSMQ可以提供高質量的Reliable Messaging
咱們知道,在通常的狀況下,若是Client端以異步的方式對Service進行調用就意味着:Client沒法獲知Message是否成功抵達Service端;也不會得到Service端執行的結果和出錯信息。可是咱們仍然說MSMQ爲咱們提供了可靠的傳輸(Reliable Messaging),這主要是由於MSMQ爲咱們提供一些列Reliable Messaging的機制:

  • 超時機制(Timeout):能夠設置發送和接收的時間,超出該時間則被認爲操做失敗。

  • 確認機制(Acknowledgement):當Message成功抵達Destination Queue,或者被成功接收,向發送端發送一個Acknowledgement message用以確認操做的狀態。

  • 日誌機制(Journaling):當Message被髮送或接收後,被Copy一份存放在Journal Queue中。

此外,MSMQ還提供了 死信隊列 (Dead letter Queue)用以保存發送失敗的message。這一切保證了保證了Reliable Messaging。
2、 MSMQ在WCF的運用
在WCF中,MSMQ提供的數據傳輸功能被封裝在一個 Binding 中,提供 WCF Endpoint之間 、以及Endpoint和現有的基於MSMQ的Application進行通訊的實現。爲此WCF爲咱們提供了兩種不一樣的built-in binding:

  • NetMsmqBinding:從提供的功能和使用 方式上看,NetMsmqBinding和通常使用的binding,好比basicHttpBinding,netTcpBinding沒有什麼區別:在兩個Endpoint之間實現了數據的通訊,所不一樣的是,它提供的是基於MSMQ的Reliable Messaging。從變成模式上看,和通常的binding徹底同樣。

  • MsmqIntegrationBinding:從命名上咱們能夠看出,MsmqIntegrationBinding主要用於須要將咱們的WCF Application和現有的基於MSMQ的Application集成的狀況。MsmqIntegrationBinding實現了WCF Endpoint和某個Message Queue進行數據的通訊,具體來講,就是實現了單一的向某個Message Queue 發送Message,和從某個Message Queue中接收Message的功能。從編程模式上看,也有所不一樣,好比Operation只接收一個MsmqMessage<T>的參數。

這是Client和Service通訊的圖示:

WCF筆記--MSMQ的使用 - 無牽℡↘嘸褂 - 菁華隱沒℡↘芳流歇絕
3、MSMQ和Transaction
MSMQ提供對Transaction的支持。在通常的狀況下,MSMQ經過 Message Queue Transaction 實現對Transaction的原生的支持,藉助Message Queue Transaction,能夠把基於一個或多個Message Queue的相關操做歸入同一個Transaction中。
Message Queue Transaction僅僅限於基於Message Queue的操做,假若操做涉及到另一些資源,好比SQL Server, 則可使用基於DTC的 分佈式Transaction
對於WCF中MSMQ,因爲Client和Service的相對獨立(可能Client發送Message到Service處理Message會相隔很長一段時間),因此Client和Service的操做只能歸入不一樣的Transaction中,以下圖。
WCF筆記--MSMQ的使用 - 無牽℡↘嘸褂 - 菁華隱沒℡↘芳流歇絕


代碼: 
1.終結點配置
<endpoint address="net.msmq://localhost/private/orders" binding="netMsmqBinding"

bindingConfiguration ="msmqBinding" contract="Contract.IOrderProcessor" />


2.託管建立MSMQ隊列


string path = @".\private$\orders";

if(!MessageQueue.Exists(path))
{
MessageQueue.Create(path,true);
}


3.客戶端使用


ChannelFactory<IOrderProcessor> channelFactory = new ChannelFactory<IOrderProcessor>("defaultEndpoint");

IOrderProcessor channel  = channelFactory.CreateChannel();
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))


       channel.Submit(order);
       scope.Complete();
}


自然斷開異步事務集於一身,,使用簡單方便更乃王道...
相關文章
相關標籤/搜索