【问题标题】:server push for millions of concurrent connections服务器推送数百万个并发连接
【发布时间】:2012-04-24 07:42:21
【问题描述】:

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

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

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

所以:

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

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

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

【问题讨论】:

  • 这个比较难接受。您是否考虑过像 UDP 这样的无连接协议?您必须编写自己的 ack 协议,但您不必维护连接,也不必承担连接开销。我编写了一些非常高吞吐量的分布式服务器,但不是面向客户的。
  • 仅供参考,我同时使用 netty 实现了它(见下面的答案)。
  • 酷@Daniel。我得去看看。我听说过有关 Netty 的好消息,但从未使用过。

标签: xmpp websocket messaging publish-subscribe server-push


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我发现了一篇关于该主题的有趣文章:metabrew.com/article/… 您可能会感兴趣,作者通过使用处理连接以替换 erlang 的 C 库设法进一步优化内存占用空间。跨度>
    • Maksims Mihejevs:请您回答以下问题,对我有帮助。谢谢。stackoverflow.com/questions/23597203/…
    猜你喜欢
    • 2013-10-13
    • 2015-03-31
    • 2011-10-18
    • 2013-03-31
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多