2011-11-30 42 views
1

我有一個使用WCF服務(NetTcpBinding)實現的客戶端/服務器設置。設置是這樣的,客戶端基本上向服務器發送一些命令和指令(主要是單向呼叫)。但是,服務器可能處於需要非常迅速地將大量數據發送回客戶端的情況。我已經實現了目前在主WCF服務上使用回調(服務器非常頻繁地進行回調)。下面使用兩個WCF服務而不是一個回調?

但我有一段時間讓它正常工作。它大多數似乎歸結爲客戶端在服務器正在向客戶端發送大量數據的過程中調用服務器時發生的異常/掛起(大部分掛起)。我已經嘗試了幾乎所有的事情,比如將我的大部分電話設置爲[OperationContract(IsOneWay=true)],並將ConcurrencyMode=ConcurrencyMode.Multiple設置爲ServiceBehavior。這減少了掛起的次數,但沒有阻止它們。

所以,因爲對我來說,迅速得到一個可行的解決方案是最重要的(最後期限將至),我考慮重構有兩個WCF服務。第一個就像所有客戶端服務器現在使用這些命令一樣。第二個方向相反,並且在客戶端連接到服務器之後進行設置。該服務將用於將數據發送回客戶端。

這種方法有什麼缺點嗎? WCF服務在兩個方向都有問題嗎?任何其他提示或技巧?或者我完全不在這個基地?

+0

是否有可能將您的響應分解爲多個頁面,然後客戶端將使後續請求檢索?我不知道通過一次服務呼叫發送大量數據是一個好主意。 – Kekoa

+0

@Kekoa - 不是真的......這不符合要求。該服務的重點是以近似實時的方式監控數據饋送。我可以在某種程度上「分塊」數據......或者我想我可以讓客戶端以某個間隔(「GetLastData」類型的呼叫)請求數據。人力資源管理... – Tim

回答

1

這聽起來對我來說不是一個壞主意。第一個服務可以將命令或其他任何內容添加到第二個服務用於按順序處理的隊列中。

你甚至可以有第二個服務調用回第一服務,則這將回調到客戶端。這樣,客戶只需與一個服務進行交談,除了接受請求並回吐結果之外,其他服務實際上並沒有多大作用。第二項服務可以在自己的時間內完成。

0

這是一個有點棘手的情況,我不認爲這是可怕的做到這一點,你所概述的方式,雖然可能有一些維護的缺點。

服務器需要知道客戶端的地址來調用他們的WCF服務。一開始這可能不是問題,但如果您添加客戶端或升級客戶端,那麼您可能會遇到一些挑戰。

如果客戶有責任使所有的呼叫,然後,讓當你向外擴展更容易維護。

變成爲關你上面的評論,如果你以後有什麼是近實時監控,敢問使用WCF的在所有的這一點。可能需要更多時間才能建立(因爲不是在這個截止日期),但是從長遠來看,爲系統量身定製的系統可能會更好。

我可能會用一個多播排隊的解決方案,那就是你有一臺服務器,但多個聽衆去,那麼你的服務器保持在隊列中推動項目(可能的文本行)和客戶端閱讀。像AMQP(如rabbitmq),MSMQ(沒有使用它,但它是由微軟),zeromq等。像

甚至簡單的套接字通信會給你更多的性能,你不會有一個框架計時(看看zeromq,它幾乎像一個套接字一樣工作)。這樣客戶端就可以連接,並在不再需要時接收更新並斷開連接。