如何扩展 Node.js WebSocket Redis 服务器?
Posted
技术标签:
【中文标题】如何扩展 Node.js WebSocket Redis 服务器?【英文标题】:How to Scale Node.js WebSocket Redis Server? 【发布时间】:2012-10-12 07:40:17 【问题描述】:我正在为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 无法扩展。为什么会有人这么说。那是什么意思?如果这是真的,对于发布/订阅和/或存储所有广播消息的列表是否有更好的解决方案?
注意:如果您的答案是 Acani 永远不需要扩展,即使地球上所有 70 亿人(并且还在增长)中的每一个人每秒都向地球上的其他人广播一条消息,那么请给出一个有效的解释.
【问题讨论】:
【参考方案1】:好吧,你的问题的答案很少:
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 稳定且对我们的客户有用时,我们才会发布稳定版,但我们希望在 2012 年夏天有一个合理的测试版,并在发布之前发布第一个稳定版2012 年底。
在此处查看演示文稿:http://redis.io/presentation/Redis_Cluster.pdf
【讨论】:
【参考方案2】:2) 使用 Redis 可能无法存储连接:Redis 可以以字符串格式存储数据,如果连接对象具有循环引用(即 Engine.IO),您将无法序列化它们
3) 为每个客户端创建一个新的 Redis 客户端可能不是一个好方法,所以如果可以的话,请避免这个陷阱
考虑使用 ZMQ 节点库让进程通过 TCP(或 IPC,如果它们在 master-worker 中集群)相互通信
【讨论】:
以上是关于如何扩展 Node.js WebSocket Redis 服务器?的主要内容,如果未能解决你的问题,请参考以下文章
Node.js+websocket+mongodb实现即时聊天室
Windows下Node.js+Express+WebSocket 安装配置
如何使用 node.js 使 Websocket 服务器安全
Unity 如何连接基于 Node.js 的 Secure WebSocket?