如何扩展Node.js WebSocket Redis服务器?

时间:2012-10-22 13:22:33

标签: node.js websocket redis scalability load-balancing

我正在为Acani编写聊天服务器,我对Scaling node.jswebsockets with load balancer scalability有一些疑问。

  1. 负载均衡Node.js究竟是什么意思?这是否意味着我的服务器应用程序的 n 独立版本正在运行,每个版本都在一个单独的服务器上?

  2. 为了允许一个客户端向所有其他客户端广播消息,我存储了一组在服务器上打开的所有webSocketConnections。但是,如果我的 n 运行我的服务器应用程序的独立版本,每个版本都在一个单独的服务器上,那么我将 n 不同的webSocketConnections组吗?

  3. 如果答案是1& 2是肯定的,那么如何存储webSocketConnections的通用集(跨所有服务器)?我认为我可以这样做的一种方法是使用Redis Pub / Sub,只需让每个webSocketConnection订阅Redis上的频道。

  4. 但是,单个Redis服务器不会成为瓶颈吗?然后我如何缩放Redis?扩展Redis甚至意味着什么?这是否意味着我在不同服务器上运行的 m 独立版本的Redis?这甚至可能吗?

  5. 我听说Redis没有扩展。有人会这么说。那是什么意思?如果这是真的,对于pub / sub和/或存储所有广播消息的列表是否有更好的解决方案?

  6. 注意:如果你的答案是Acani永远不必扩展,即使地球上所有70亿人(并且正在增长)中的每一个人每秒向地球上的其他人广播一条消息,那么请给出有效的解释

2 个答案:

答案 0 :(得分:6)

嗯,你的问题答案很少:

  1. 要对Node.js进行负载均衡,这意味着您对它的看法正是如此,除了您不需要单独的服务器,您可以在同一台机器上运行多个节点服务器进程

  2. 节点服务器的每个服务器/进程都有自己的连接,websockets的默认存储(例如Socket.IO)是MemoryStore,这意味着所有连接都将存储在机器内存中,它需要使用RedisStore才能将redis用作连接存储。

  3. Redis PUB / SUB是实现此任务的好方法

  4. 你对这里所说的是正确的,此时redis不会扩展,并且运行许多连接到redis的进程/连接会使redis成为瓶颈。

  5. Redis无法扩展,这是正确的,但根据此演示文稿,您可以看到集群开发在redis中处于首要位置,而redis确实有一个集群,它还不稳定:(取自http://redis.io/download

  6.   

    Redis群集在哪里?

         

    Redis开发目前专注于Redis 2.6,它将为您提供对Lua脚本和许多其他改进的支持。这是我们当前的优先级,但不稳定分支已经包含Redis Cluster的大部分基本部分。在2.6发布之后,我们将集中精力将当前的Redis Cluster alpha转换为用户可以开始认真测试的beta产品。   很难做出预测,因为只有当我们认为Redis Cluster坚如磐石且对我们的客户有用时,我们才会发布Redis Cluster,但我们希望在2012年夏季能够获得合理的测试版,并在发布之前发布第一个稳定版本。 2012年底。

    请参阅此处的演示文稿:http://redis.io/presentation/Redis_Cluster.pdf

答案 1 :(得分:1)

2)使用Redis可能无法存储连接:Redis可以以字符串格式存储数据,如果连接对象具有循环引用(即Engine.IO),则无法将它们序列化

3)为每个客户端创建一个新的Redis客户端可能不是一个好方法,所以如果可以的话,请避免使用该陷阱

考虑使用ZMQ节点库让进程通过TCP(或IPC,如果它们像在master-worker中一样聚集)相互通信。