方法A:
如果你要創建兩個單獨的主機(即一個WCF服務,一個用於「輪詢」服務),那麼你真的只有一個選項,以使所有的工作很好。
Windows服務通信非常有限(沒有服務端點的幫助,例如WCF)。因此,如果您要在Windows服務中託管您的「輪詢」服務,則無論如何您必須將其與WCF服務連接起來。
然後在一個Windows服務中同時託管兩個服務並通過手動實例化WCF主機並將「輪詢」服務傳遞給構造函數是可行的。
protected override void OnStart(string[] args)
{
//...
// This would be you "polling" service that would start a background thread to poll the db.
var notificationHost = new PollingService();
// This is your WCF service which you will be "self hosted".
var serviceHost = new WcfService(notificationHost);
new ServiceHost(serviceHost).Open();
//...
}
這是很不理想,因爲你需要通過事件的兩個服務之間的溝通,再加上你的WCF服務必須手動實例化上下工夫單模式下運行......所以這給你留下...
方法B:
如果你要承載您的WCF服務裏面的「查詢」服務,你會碰到一些問題。
- 您需要了解創建的「輪詢」服務實例的數量。如果您的WCF服務已配置爲每個會話都實例化,則最終可能會有太多「輪詢」服務,最終可能會導致您的數據庫/服務器死機。
- 爲了避免第一個問題,您可能需要設置一個單例WCF服務,這可能會在不久的將來導致一個擴展問題,即一個WCF服務實例不足以處理連接請求的數量。
方法C:
鑑於方法A和B的弊端,最好的解決辦法是舉辦兩個獨立的WCF服務。
- 這是您的訂閱/取消訂閱/發佈的常規服務。
- 這是您的訂閱/取消訂閱的輪詢單身服務。
這個想法是,您的常規服務在收到訂閱者後會打開一個到您的輪詢服務的新連接或使用現有的連接(取決於您如何配置會話)並等待回覆。您的輪詢服務是一個長時間運行的WCF服務,用於輪詢您的數據庫並將通知發佈給其訂閱者(即另一個WCF主機)。
優點:
- 你放心,會出現只有一個輪詢服務。
- 您可以擴展您的解決方案以託管IIS中的常規服務和Windows服務中的輪詢服務。
- 兩種服務之間的通信限制最小,不需要事件。
- 通過它們的接口相互依賴地測試每個服務。
- 服務之間低耦合和高內聚(這是我們想要的!)。
缺點:
- 更多的服務意味着更多的接口和契約來維持。
- 更復雜。
可以使用高性能緩存系統(如Couchbase或AppFabric)來存儲排隊數據。通過這種方式,數據不會變化。 –
如何使WCF服務「消耗」隊列中的結果? 這將建議WCF服務本身應該有一些工作線程輪詢隊列...你有我的任何示例\示例代碼? (你說這是一個普通的架構) –
@Erix - 你有答案嗎? –