我正在为Acani编写聊天服务器,我对Scaling node.js和websockets with load balancer scalability有一些疑问。
负载均衡Node.js究竟是什么意思?这是否意味着我的服务器应用程序的 n 独立版本正在运行,每个版本都在一个单独的服务器上?
为了允许一个客户端向所有其他客户端广播消息,我存储了一组在服务器上打开的所有webSocketConnections
。但是,如果我的 n 运行我的服务器应用程序的独立版本,每个版本都在一个单独的服务器上,那么我将 n 不同的webSocketConnections
组吗?
如果答案是1& 2是肯定的,那么如何存储webSocketConnections
的通用集(跨所有服务器)?我认为我可以这样做的一种方法是使用Redis Pub / Sub,只需让每个webSocketConnection
订阅Redis上的频道。
但是,单个Redis服务器不会成为瓶颈吗?然后我如何缩放Redis?扩展Redis甚至意味着什么?这是否意味着我在不同服务器上运行的 m 独立版本的Redis?这甚至可能吗?
我听说Redis没有扩展。有人会这么说。那是什么意思?如果这是真的,对于pub / sub和/或存储所有广播消息的列表是否有更好的解决方案?
注意:如果你的答案是Acani永远不必扩展,即使地球上所有70亿人(并且正在增长)中的每一个人每秒向地球上的其他人广播一条消息,那么请给出有效的解释
答案 0 :(得分:6)
嗯,你的问题答案很少:
要对Node.js进行负载均衡,这意味着您对它的看法正是如此,除了您不需要单独的服务器,您可以在同一台机器上运行多个节点服务器进程
节点服务器的每个服务器/进程都有自己的连接,websockets的默认存储(例如Socket.IO)是MemoryStore,这意味着所有连接都将存储在机器内存中,它需要使用RedisStore才能将redis用作连接存储。
Redis PUB / SUB是实现此任务的好方法
你对这里所说的是正确的,此时redis不会扩展,并且运行许多连接到redis的进程/连接会使redis成为瓶颈。
Redis无法扩展,这是正确的,但根据此演示文稿,您可以看到集群开发在redis中处于首要位置,而redis确实有一个集群,它还不稳定:(取自http://redis.io/download)
Redis群集在哪里?
Redis开发目前专注于Redis 2.6,它将为您提供对Lua脚本和许多其他改进的支持。这是我们当前的优先级,但不稳定分支已经包含Redis Cluster的大部分基本部分。在2.6发布之后,我们将集中精力将当前的Redis Cluster alpha转换为用户可以开始认真测试的beta产品。 很难做出预测,因为只有当我们认为Redis Cluster坚如磐石且对我们的客户有用时,我们才会发布Redis Cluster,但我们希望在2012年夏季能够获得合理的测试版,并在发布之前发布第一个稳定版本。 2012年底。
答案 1 :(得分:1)
2)使用Redis可能无法存储连接:Redis可以以字符串格式存储数据,如果连接对象具有循环引用(即Engine.IO),则无法将它们序列化
3)为每个客户端创建一个新的Redis客户端可能不是一个好方法,所以如果可以的话,请避免使用该陷阱
考虑使用ZMQ节点库让进程通过TCP(或IPC,如果它们像在master-worker中一样聚集)相互通信。