7

我正在构建一个分布式系统,该系统可能由数百万个客户端组成,这些客户端都需要保持开放(最好是 HTTP)连接以等待来自服务器(在其他地方运行)的命令。消息/命令的负载不会很高,可能是一条消息/秒/1000 个客户端,这意味着它将是 1000 个消息/秒@100 万个客户端。=> 它基本上是关于并发连接的。

要求也很简单。一种方式消息传递(服务器->客户端),每个“通道”只有 1 个客户端。

我在技术方面非常开放(xmpp / websockets / comet / ...)。我使用 Google App Engine 作为服务器,但不幸的是,他们的“渠道”对我不起作用(配额太低且没有 Java 客户端)。XMPP 是一种选择,但非常昂贵。到目前为止,我使用的是 URL Fetch 和 pubnub,但他们刚刚开始为连接收费(大时代)。

所以:

  1. 有没有人知道可以以负担得起的方式为我做到这一点的服务?我发现大多数连接都受到限制或高额收费。

  2. 有自己实现这种服务器的经验吗?我实际上已经这样做了,它工作得很好(基于 Tomcat 和 NIO),但我还没有时间实际设置一个大型负载测试环境(部分是因为这仍然是一个后备解决方案,我更喜欢一个久经沙场的消息服务器)。您对每 GB 获得多少用户有任何经验吗?有什么硬性限制吗?

我的架构还允许对 msg 服务器进行分段,但我想最大化并发连接,因为 msg 处理 CPU 开销很小。

4

2 回答 2

6

同时,我使用 netty.io 实现了我自己的消息服务器。Netty 使用 Java NIO 并且扩展性非常好。对于空闲连接,我得到每个连接 500 字节的内存占用。我只做非常简单的消息转发(没有缓存、存储或其他花哨的东西),但在小型亚马逊实例(1ECU / 1.6GB)上很容易获得 1000 - 1500 msg / sec(每个半 KB)。

否则,如果您正在寻找(付费)服务,那么我可以推荐 spire.io(他们不收取连接费用,但每条消息的价格更高)或 pubnub(他们确实收取连接费用,但每条消息更便宜)。

于 2012-05-25T23:32:30.650 回答
3

您必须更多地关注构建这种环境的架构。首先,如果您要自己编写套接字管理,则不要使用 Thread per Client Socket。使用异步方法接收和发送数据。如果您的消息很小,WebSockets 可能太重了。因为它实现了框架,它必须单独应用于每个套接字的每个消息(缓存可用于不同版本的 WebSockets 协议),这使得它们处理两个方向的速度变慢:接收和发送,特别是因为数据屏蔽.

可以创建数百万个套接字,但只有最先进的技术才能做到这一点。Erlang 能够处理数百万个连接,并且具有相当大的可扩展性。如果您希望使用其他更高级别的技术拥有数百万个连接,那么您需要考虑对您要完成的任务进行集群。

例如,使用将跟踪所有处理服务器的网关服务器。并拥有它们的数据(IP、端口、负载(如果它是一个内部网络,防火墙和端口转发可能在这里很方便)。客户端软件连接到该网关服务器,网关服务器检查负载最少的服务器并发送 ip 和端口到客户端。客户端使用提供的地址直接创建到工作服务器的连接。这样你将拥有网关,它也可以处理授权,并且不会长时间保持连接,所以其中一个可能就足够了。许多正在发布的工作人员数据和保持连接。

这与您的需求非常相关,可能不适合您的解决方案。

于 2012-04-12T09:14:12.280 回答