由於我期望開發高性能,可擴展的TCP服務器,因此我一直在閱讀很多關於線程的內容,這些服務器能夠處理高達10,000-20,000個客戶端,其每個客戶端通過基於命令的系統雙向地與服務器進行雙向通信。服務器將收到一個命令,並按照該命令執行單個(或多個)任務。我的問題是如何在各種情況下適當地使用.NET線程構造,根據正在執行的工作執行可能需要一分鐘到幾個小時的任務。C# - 何時在高活動服務器中使用標準線程,ThreadPool和TPL
最令我困惑的是,在我閱讀的每一個地方,我都看到類似於「使用手動創建的線程(或自定義線程池)來處理'長時間運行'的任務,並將TPL用於短期任務,或者需要並行處理的任務。「究竟是什麼是長時間運行的任務?那是5秒60秒嗎?
用什麼時間框架,我應該使用每個創建線程的這三種方法:
- 手動創建的線程
- 的.NET ThreadPool類
- TPL
另一個問題我預期如下 - 說我的服務器確實有20,000個客戶端連接,每個客戶端每秒發送一個命令(可以轉換爲一個或多個任務)。即使使用強大的硬件,我是不是有可能將工作負載的過高壓入任何線程池/工作項目隊列中,從而在隊列緩慢填充到最大值後最終生成OutOfMemoryException?
任何瞭解將不勝感激。
平均每個命令需要處理多長時間? – rene 2011-03-13 09:44:57
就是這樣 - 事實上並沒有說明命令需要多長時間才能完成。我覺得我已經收到足夠的信息來做出相應的規劃。當然,20,000個客戶是一個遠投(5000個更像是它),但我希望在必要時能夠在未來擴展。感謝大家的迴應。 – slashp 2011-03-13 09:57:56
@slashp長時間運行意味着「超過幾百毫秒」,即。破壞你的其他工作的東西(並且引入了顯着的處理延遲)。例如,如果您的目標延遲時間爲5毫秒,那麼即使1毫秒也可以被認爲是「長時間運行」:D另外,我想指出20k個TCP客戶端正在接近實際的限制 - 每個TCP連接需要一個單獨的端口,你最多隻有65535 *最大值 - 他們在關閉後約4分鐘。您可能不得不考慮擴展(更多服務器),而不是擴展(每個服務器更多的連接)。 – Luaan 2014-03-27 08:42:20