2013-12-18 122 views
0

我會感謝一些關於Windows服務(c#)的設計建議,以便將報告發布到SOAP服務。使用MSMQ隊列來分離消息生產者和消費者?

它從數據庫(Oracle AQ表中的報告)中提取有限的一組報告,將它們聚合成消息並將此消息轉發給WCF SOAP服務。 如果報告已成功通過SOAP傳輸,則報告被標記爲「已發送」。 否則它們會再次添加到AQ表(通過數據庫作業)。

所以我想出了以下設計。 什麼是最好的方式去? 隊列會在可擴展性,健壯性和解耦方面改進設計嗎? 在這種情況下使用排隊是一個好主意嗎?

建議設計A: 1到N個線程的服務。 每個線程進程報告同步(獲取報告,聚集,翻譯,經由SOAP發送)

提出的設計B: Windows服務用:

  • 1 MSMQ消息隊列
  • 1到N生產者線程: (取出報告, 聚集,經由MSMQ排隊消息)
  • 1到N消費者線程: (出隊,翻譯,經由SOAP dipatching)

提出的設計C:

  • 的Windows與生產者線程服務(獲取報告,彙總,排隊的消息通過WCF NetMsmqBinding客戶的私人MSMQ隊列)
  • IIS /託管啓用MSMQ服務(監聽到MSMQ隊列,出列,翻譯,通過SOAP進行匹配)

回答

2

是否有您選擇MSMQ的特定原因?如果您使用建議的設計B,則可以使用BlockingCollection

我沒有看到MSMQ在這種情況下提供了一個特別的優勢,除非您想要多個進程或者您希望跨多臺計算機進行傳播。

但你真的甚至需要多個線程嗎?看起來你的限制因素是數據庫訪問時間或者與WCF服務的通信。除非WCF服務必須做一些重要的處理,然後才能成功調用該作業。

那麼你肯定你不能只是有:

while there are unsent jobs in the database 
    get job 
    send job to WCF 
    if job sent successfully 
     mark job as sent 
end while 

顯然我對你的情況瞭解僅限於你已經張貼在你的問題是什麼,所以這是可能的,我錯過了一些重要的東西。

+0

我想過解耦消息的創建和分派。所以我試圖申請一個隊列。但正如你所描述的簡單設計(獲得工作,發送工作,標記工作)就足夠了。這也是我的第一個方法。 排隊在Oracle AQ表中完成。所以另一個MSMQ隊列將沒有優勢。遠程WCF服務並不複雜(只有驗證和持久性)。 所以服務應該取回和發送作業。它基本上是一個Message Broker。外部WCF SOAP服務接口可能會改變。它應該很容易交換(對於其他客戶)。 –

+0

目前我嘗試設計服務(數據訪問,消息聚合,WCF客戶端調用)。使用GetJob()/ SetJobStatus方法的IIS/WAS /自託管的WCF服務(net.pipe)是否提供了更好的分離以及更好的可重用性/可伸縮性? Windows服務本身只會調用GetJob,將消息轉發給外部WCF客戶端,然後使用SetJobStatus。 –