2010-12-15 122 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