如何扩展Node.js WebSocket Redis服务器?
我正在为Acani写一个聊天服务器,而且我还有一些关于使用负载均衡器可伸缩性来扩展 node.js和websockets的问题。
-
究竟是什么意思来负载均衡Node.js? 这是否意味着将有n个独立版本的服务器应用程序运行,每个版本都在一个单独的服务器上运行
-
为了允许一个客户端向所有其他客户端广播消息,我存储了一组在服务器上打开的所有
webSocketConnections
。 但是,如果我有我的服务器应用程序运行n个独立版本,每个在一个单独的服务器上,那么我将有n套不同的webSocketConnections
? -
如果1和2的答案是肯定的,那么如何存储通用的
webSocketConnections
(跨所有服务器)? 我想我可以做的一个方法是使用Redis Pub / Sub,并且每个webSocketConnection
订阅Redis上的一个频道。 -
但是,那Redis服务器不会成为瓶颈吗? 那么我将如何扩展Redis? 这对Redis的规模意味着什么? 这是否意味着我有不同的服务器上运行Redis独立版本? 这甚至可能吗?
-
我听说Redis没有扩展。 为什么有人会这么说呢。 那是什么意思? 如果这是真的,有没有更好的解决scheme发布/分发和/或存储所有广播的消息列表?
注意:如果你的答案是Acani永远不会规模化,那么即使地球上70亿人(和成长中的每一个人)都要每秒钟向地球上的每个人传播一个信息,那么请给出一个有效的解释。
那么,你的问题很less有答案:
-
为了实现Node.js的负载均衡,它意味着你对它的想法是什么,除了你不需要单独的服务器之外,你可以在同一台机器上运行多个节点服务器的进程。
-
节点服务器的每个服务器/进程都将拥有自己的连接,websockets的默认存储(例如Socket.IO)是MemoryStore,这意味着所有连接都将存储在机器的内存中,因此需要使用RedisStore以便与Redis一起作为连接存储。
-
Redis PUB / SUB是实现这一任务的好方法
-
你在这里说的是正确的,redis在这个时候不会扩展,运行很多连接到redis的进程/连接可能会使redis成为一个瓶颈。
-
Redis没有扩展,这是正确的,但是根据这个介绍,你可以看到在Redis中集群开发是最重要的,而Redis确实有一个集群,但它还不够稳定:(取自http:// redis。 io /下载 )
Redis集群在哪里?
Redis开发目前专注于Redis 2.6,它将为您提供对Lua脚本和其他许多改进的支持。 这是我们当前的重点,然而不稳定的分支已经包含了Redis集群的大部分基本部分。 在2.6版本之后,我们将集中精力将当前的Redis Cluster alpha转换为beta版产品,用户可以开始认真testing。 我们很难做出预测,因为只有当我们认为Redis Cluster对我们的客户来说是稳定且有用的时候,才会把Redis Cluster释放为稳定的,但是我们希望在2012年夏季有一个合理的testing版,并且在2012年底。
请参阅此处的演示文稿: http : //redis.io/presentation/Redis_Cluster.pdf
2)使用Redis可能无法存储连接:Redis可以以string格式存储数据,并且如果连接对象具有循环引用(即Engine.IO),则无法将其串行化
3)为每个客户端创build一个新的Redis客户端可能不是一个好方法,所以如果可以的话避免陷阱
考虑使用ZMQ节点库来让进程通过TCP相互通信(或者如果它们像在主人一样进行群集,则是IPC)