百万并发连接的服务器推送

7
我正在构建一个分布式系统,由数百万个客户端组成,它们都需要保持开放的(最好是HTTP)连接,等待来自服务器(运行在其他地方)的命令。消息/命令的负载不会很高,可能是1000个客户端每秒/一条消息,这意味着在1百万个客户端中将产生1000条消息/秒。这基本上涉及并发连接问题。
要求也很简单,单向消息传递(服务器->客户端),每个“通道”只有1个客户端。
我在技术方面非常开放(xmpp / websockets / comet / ...)。我正在使用Google App Engine作为服务器,但他们的“通道”不适用于我(配额太低,没有Java客户端)。XMPP是个选择,但很昂贵。到目前为止,我使用了URL Fetch和Pubnub,但他们开始收取连接费用(非常高)。
所以:
1. 有人知道是否有一个可以以经济实惠的方式为我执行此项任务的服务吗?我发现大多数服务都会限制连接或严重收费。
2. 是否有实现这样的服务器的经验?我已经做过了,它效果非常好(基于Tomcat & NIO),但我还没有时间建立一个大的负载测试环境(部分原因是这仍然是一种后备解决方案,我更喜欢一个经过实战检验的消息服务器)。有多少用户可以在每GB内获得连接?任何硬限制吗?
我的架构也允许分片的消息服务器,但我想最大化并发连接,因为消息处理CPU开销很小。

这个可能比较难接受。你考虑过像UDP这样的无连接协议吗?你需要编写自己的确认协议,但是你就不必维护连接,也不必承担连接开销了。我曾经编写过一些非常高吞吐量的分布式服务器,但并非面向客户端。 - Gray
顺便提一下,我已经使用Netty实现了它(请参见下面的答案)。 - Daniel
很酷,@Daniel。我得去看看。我听说过Netty很不错,但从未使用过。 - Gray
2个回答

6
我已经使用netty.io实现了自己的消息服务器。Netty利用Java NIO并且具有良好的可扩展性。对于空闲连接,每个连接的内存占用为500字节。我只进行非常简单的消息转发(没有缓存、存储或其他高级功能),但在小型Amazon实例(1ECU / 1.6GB)上轻松获得1000-1500条/秒(每条半KB)。
否则,如果您正在寻找(付费)服务,则可以推荐spire.io(他们不收取连接费用,但每条消息的价格更高)或pubnub(他们会收取连接费用,但每条消息的价格更便宜)。

3
你需要更深入地了解构建这样的环境的体系结构。 首先,如果你要自己编写套接字管理代码,则不要使用每个客户端套接字一个线程的方法。应该使用异步方法来接收和发送数据。 如果你的消息很小,则使用WebSockets可能会太重。因为它实现了帧,必须为每个套接字的每个消息应用它们(可以使用缓存来处理不同版本的WebSockets协议),这使得它们在接收和发送方向上处理速度变慢,特别是由于数据屏蔽。
虽然可以创建数百万个套接字,但只有最先进的技术才能胜任。Erlang能够处理数百万个连接,并且具有良好的可伸缩性。如果你想使用其他高级技术来建立数百万个连接,那么你需要考虑集群化你所要实现的内容。例如,使用网关服务器来跟踪所有处理服务器。并保存它们的数据(IP、端口、负载(如果是一个内部网络,则防火墙和端口转发可能会很有用)。客户端软件连接到网关服务器,网关服务器检查最轻载的服务器并将IP和端口发送给客户端。客户端直接使用提供的地址与工作服务器建立连接。这样,你就会有一个网关服务器,它还可以处理授权,并且不会长时间保持连接,因此可能只需要一个。以及许多负责发布数据和保持连接的工作程序。这与你的需求密切相关,但可能并不适合你的解决方案。

我找到了一篇有关该主题的有趣文章:http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1。你可能会感兴趣,因为作者成功地通过使用一个处理连接以替换Erlang的C库来进一步优化了内存占用。 - Daniel
Maksims Mihejevs:你能回答以下问题吗?这对我很有帮助。谢谢。https://dev59.com/rH_aa4cB1Zd3GeqP5JVf - Pradeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接