.net如何處理高並發socket,建立高性能健壯的socket服務


1.使用supersocket

  • 高性能的事件驅動通信;
  • 非常簡單易用; 你只需要通過創建幾個類就能獲得一個健壯的 Socket 服務器;
  • 內置的命令行協議讓你能夠迅速創建一個網絡命令行接口服務器;
  • 強大且高性能的協議解析實現工具幫你簡化了網絡數據的分析工作;
  • 靈活的配置功能和友好的配置 API;
  • 多監聽器支持; 讓你在一個服務器實例內監聽多個端口;
  • 多服務器實例托管的支持讓你從容面對復雜的部署需求;
  • 應用程序域和進程級別的隔離能夠滿足你大部分的宿主場景;
  • 內置的 SSL/TLS 加密支持;
  • 會話級別的發送隊列能夠讓你通過會話並發的發送數據,並保持高性能和可控性;
  • SuperSocket 的命令處理模式讓你的業務邏輯更清晰,更有條理;
  • 優良的可擴展 API 支持: Command Filter, Connection Filter, Command Loader;
  • 可替換的日志架構允許你使用你喜歡的日志組件;
  • 動態語言的支持; 允許你用 Python 之類的腳本語言來實現命令;
  • 與 Mono/Linux 保持二進制級別的兼容;
  • Windows Azure 的支持;
  • 內置你可以直接用於 Flash 或 Silverlight 客戶端的 Socket 策略服務器;

官網地址:http://www.supersocket.net/

SuperSocket 層次示意圖

SuperSocket Layers

SuperSocket 對象模型圖示意圖

SuperSocket Object Model

SuperSocket 請求處理模型示意圖

SuperSocket Request Handling Model

SuperSocket 隔離模型示意圖

SuperSocket Isolation Model

 

看到一個問題,說如何保持5000-10000+的健壯的socket服務。

初學者肯定是會把每個連接都開一個線程來監聽。這很浪費資源

通常只會(動態地)占用幾個線程就能保持3000個長連接會話了。
“為每個監聽對象開一個新的線程”這是設計錯誤。你可以使用NetworkStream的異步Read,在沒有消息的時候無需阻塞在什么線程里。

據不同的操作系統,多線程的約束條件也不同。當你發現工作線程超過1000個,或者IOCP(IO完成端口)線程超過800個,就應該趕緊斷掉服務器進行維護了。
首先要有一個意識,使用幾個、十幾個線程就足以應付上千個普通業務連接了。
有人說“如果我要保持1000個客戶端連接,就得開1001個線程來接收數據”,這純粹是瞎扯。請一定要注意。

我說的“工作線程”是指你的進程中使用的工作線程總數,而不是只windows的。

在你的windows中,總線程數超過1500個是經常有的事情。你可以打開你的進程管理器看看cpu的指標,看看當前有多少線程在切換使用。很可能超過1500個。但是可以監視每一個單個的進程,看看它的線程數,通常只有10個左右(只有System線程數會有100多)。

而你的服務器進程,工作線程數不應該太高。平常只有十幾個線程足以應對幾千客戶端了。

如果你用.net 開發,你可以使用  supersocket 這個是我目前開發比較全面的, 或者用一個較 fastsocket的,也不錯(相關更輕一點).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM