對於實時采集數據的項目,應用場景比如是這樣的:5000客戶端,每個客戶端每隔500MS要給服務器上傳一次數據。
大家知道,像INDY這種阻塞型的通信控件,所能支持的TCP長連接的一般地不能超過1000的數量(如果想要維持穩定運行的話)。
原因是大家都曉得的,阻塞方式會為每一個SOCKET連接創建一個新的線程為之服務,而WINDOWS單個進程理論上允許最多的線程數量是2048個,
實際當中要少得多才行。
有人說可以用WINDOWS的IOCP通信模型解決,誠然!但IOCP編程過於復雜。
有人說,可以用INDY,使用短連接的方式解決。鑒於每隔500MS就要上傳一次數據的頻率,短連接其實不適合用,因為短連接每次都要建立和斷開SOCKET連接,
而建立和斷開SOCKET連接是特別耗時的,所以使用TCP長連接的方式。
有人說為什么想着阻塞的方式,答案是:因為阻塞的編程是最簡單的。
其實對於5000長連接的客戶端,INDY一樣可以有辦法實現。既然單個進程只能支持1000個左右的長連接,那開5個進程不是就可以支持5000個長連接了嗎?
有人說,阻塞的5000個連接就意味着WINDOWS要開5000個線程,如此多的線程,WINDOWS受得了嗎?
於是馬上動手實驗,一個進程開1500個線程,一共開了4個進程,每個線程每隔100ms,執行FOR I:=1 TO 100 DO,WINDOWS任務管理器顯示,每一個進程
占用40.4M的內存,CPU使用率才百分之零點幾,總的CPU使用率才百分之幾,內存使用率也只有20%,WINDOWS調度沒有一點兒問題。
這種方案只需要一個公網IP,分別為不同的進程綁定不同的端口。