2010-12-15 121 views
4

我們有一個C/S應用程序,全都用Delphi編寫(客戶端和服務器或者中間件,如果你想的話) 對於客戶端部分我們使用Indy。 對於我們使用DXSock的服務器。Delphi服務器套接字組件

由於DXSock已經死了一段時間,我們正在研究服務器部分的備選方案。

我想聽聽一些有關Delphi的最佳服務器套接字替代組件的評論。 目前的系統通常擁有數十個永久連接,每個連接都在自己的線程上工作,但未來可能會被追蹤(如果可能,應該將其改進爲線程池)

回答

3

如果您希望獲得最佳性能,則必須使用非阻塞模式下的套接字或使用completion ports。 IPWorks就是這樣實現的,以及iocp。據我所知,Indy或Synapse不實現它們(至少正式)。

我們在我們的開源SynCrtSock單元中使用了完成端口和線程池,用於我們的Synopse SQLite3 framework

下面是該解決方案的一些基準,從Delphi 6直到Delphi XE。我不知道這是「最好的成分」,但它是一個工作和迅速的一個(每一個請求是約4 KB的JSON數據):

  • HTTP客戶端保持活動(即一個HTTP/1.1客戶端連接在請求期間保持活動): 第一個在7.87ms,在153.37ms完成,即6520/s,平均153us
  • Http客戶端多連接(即爲每個請求創建一個新的HTTP/1.0客戶端連接 - 這個連接使用完成端口和線程池): 第一次在151us中完成,在305.98ms完成,即3268/s,平均305us

對於高速公路里森,這裏有其他通信協議可以在我們的框架:

  • 命名管道訪問: 先在78.67ms,在187.15ms完成,即5343 /秒,平均187us
  • 本地窗口消息: 先在148us在112.90ms完成,即8857 /秒,平均112us
  • 直接在訪問過程:首先 在44us,在41.69ms完成,即23981 /秒,平均41us

我們使用HTTP/1.1協議通過TCP/IP,因爲在那裏我在普通TCP/IP上的開銷非常小,這對於防火牆等是一個處理良好的協議,並且允許我們的框架被AJAX應用程序使用,而其主要目的是爲Delphi客戶端提供服務。恕我直言,沒有「最好的Delphi服務器套接字替代組件」,它取決於你的服務器應用程序的目的是什麼。主要瓶頸將在Windows內核本身。也許直接訪問Windows的HTTP Kernel-Mode Driver (Http.sys)可能會有所幫助。

考慮使用專用優化服務器而不是Delphi服務器,如lighttpdCherokee使用FastCGI通過Linux下的Free Pascal(或CrossKylix)應用程序處理請求。我想這將是最好的表現。

+0

嗯,我真的希望有更多的選擇。我接受了將我指向iocp的答案。非常感謝你! – 2010-12-27 18:13:05

+0

我已經爲我們的HTTP/1.1服務器添加了http.sys支持。這是對HTTP服務器的非常快速的內核級支持。請參閱http://blog.synopse.info/post/2011/03/11/HTTP-server-using-fast-http.sys-kernel-mode-server – 2011-03-11 21:04:41

2

我使用Indy組件進行商業服務器端工作並且組件設置非常穩固(9或10)。我的服務器每天有數百萬個連接,沒有問題。

我在很多月前使用過DXSock。他一直在優化,但似乎沒有完成它。他似乎有另一個版本了。

如果您需要商業支持,那麼我會向nSoftware推薦IPWorks。

+0

根據連接的活動方式,Indy可以工作100秒,可能還有1000個併發連接,特別是對於多核計算機。只有在需要更多併發連接時,我纔會考慮替代方案。 – Misha 2010-12-24 03:35:47