如何构建一个可以处理20.000个并发连接的服务器?

时间:2009-09-29 08:00:33

标签: networking sockets concurrency

我很难进入确切的详细信息,了解服务器需要做什么(由于NDAs而不是什么),但它应该足以说它需要处理轻量级二进制文件具有许多并发连接用户的协议,约20.000是我们有相当不错的估计。

请注意,客户端不会持续发送/接收,但我需要保持套接字打开,因为当客户端需要响应时,我们需要尽快并且没有时间来开启新的开销每次连接。

该协议非常轻量级,因此不会有大量数据通过网络传输 - 主要问题是同时保持~20,000个套接字打开。

(我知道规格有点模糊,但我真的不能详细说明)

我对我需要做什么以及服务器需要什么类型的硬件有一个相当不错的想法,但我想我会在这里询问现有项目,技术,语言(例如Erlang),等等,可以帮助我建立这个。

如何实现这一目标?

5 个答案:

答案 0 :(得分:4)

如果您不必通过防火墙,请考虑使用基于UDP的协议。 NFS是基于UDP协议的一个很好的例子。 UDP没有TCP的设置开销,可以扩展到超过65k的并发连接。但是,如果您需要保证交付,则必须在应用程序中构建此功能。

对于具有大量用户群的性能,请考虑使用基于非阻塞I / O的服务器体系结构。

可能值得关注的另一个项目是Douglas Schmidt的Adaptive Communications Environment(ACE)。它是用于构建高性能服务器的成熟C ++框架,主要针对电信应用。它支持各种线程模型,并为您处理大多数棘手的事情。您可能会发现,在前面学习如何驱动它的时间将在轨道中保存,以减少调试工作中的混乱同步问题。

答案 1 :(得分:2)

维护20,000个连接的套接字不是问题。只要您使用I / O完成端口和/或线程池API,就可以在Windows(服务器)上使用C来轻松完成。

我认为真正的问题是为这20,000个连接生成数据。 可能需要一些奇特的解决方案 - Erlang或其他什么。但事情的插座方面并非微不足道,而是在传统服务设计的范围内。

答案 2 :(得分:2)

看一下微软机器人专家的CCR。我允许你进行Erlang类型编程(消息传递,队列等),但只使用c#而不是一种全新的函数式语言。

此外,它能够利用异步编程模型,在线程池中不需要几十个线程来完成你的工作。它更快,并提供非常优雅的代码。

我自己使用的是一台短信服务器,需要以极快的速度吐出短信,而且不会给CPU带来任何压力

答案 3 :(得分:1)

Erlang具有轻量级线程和出色的二进制处理功能,非常适合。就硬件而言,如果协议非常轻量级,我看不出你需要一个非常昂贵的服务器,但这将取决于收到数据包后需要进行的其他处理。

修改

如果您需要按索引进行数据查找,或者某些内容Mnesia也更高,并且在内存和基于磁盘的存储中都支持,并且如果您最终需要迁移到更多服务器则完全分发

关于Erlangs连接处理功能的一些真实世界信息 http://www.sics.se/~joe/apachevsyaws.html

答案 4 :(得分:1)

您不需要在单个服务器上支持20K并发用户。三个或四个之间的负载平衡,如果您正在进行任何数据库工作,请将它们连接到后端数据库;或许可以使用memcache进行测量,具体取决于您正在构建的应用程序。