我會感謝一些關於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進行匹配)
我想過解耦消息的創建和分派。所以我試圖申請一個隊列。但正如你所描述的簡單設計(獲得工作,發送工作,標記工作)就足夠了。這也是我的第一個方法。 排隊在Oracle AQ表中完成。所以另一個MSMQ隊列將沒有優勢。遠程WCF服務並不複雜(只有驗證和持久性)。 所以服務應該取回和發送作業。它基本上是一個Message Broker。外部WCF SOAP服務接口可能會改變。它應該很容易交換(對於其他客戶)。 –
目前我嘗試設計服務(數據訪問,消息聚合,WCF客戶端調用)。使用GetJob()/ SetJobStatus方法的IIS/WAS /自託管的WCF服務(net.pipe)是否提供了更好的分離以及更好的可重用性/可伸縮性? Windows服務本身只會調用GetJob,將消息轉發給外部WCF客戶端,然後使用SetJobStatus。 –