2

我知道这个问题之前已经部分被问过(如何扩展 Node.js WebSocket Redis 服务器?),但我想知道是否有任何替代 redis 的方法可以在节点实例之间快速共享 websocket 对象,特别是 ws 类型的套接字(https:// github.com/einaros/ws)。我已经尝试过 redis,但遇到了 Web 套接字对象是循环且难以序列化的问题。然后我使用了 Crockford 的 cycle.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js),但是它似乎去掉了 websocket 对象方法,因为我从节点那里得到一个错误说“对象对象没有方法发送”在我从 redis 读回套接字并重新循环后。任何帮助将非常感激。

提前感谢,詹姆斯。

4

3 回答 3

2

IMO 你应该为此使用消息队列.. 例如(RabbitMQ)

  1. 应用程序在节点 A 和节点 B 上启动并连接到 RabbitMQ
  2. 客户端 A 连接到节点 A 并订阅名为 XXX Client 的队列
  3. 客户端 B 连接到节点 B 并订阅名为 XXX 的队列
  4. 客户端 A 向 websocket 服务器发送消息 Websocket 服务器向节点 A 发送消息
  5. 节点 A 向 RabbitMQ 队列 XXX 发布消息
  6. 节点 B 在订阅队列 XXX 时收到来自 RabbitMQ 的消息
  7. 节点 B 向客户端 B 发送消息或将消息发布到节点 B 上所有连接的客户端

因此,您只需将消息队列放入您的架构(RabbitMQ、ZeroMQ)等

于 2014-02-05T09:48:49.913 回答
0

有一个库允许跨 node.js 进程和机器轻松扩展 WebSocket,您可以查看它:

https://github.com/ClusterWS/ClusterWS

于 2018-01-03T15:35:57.510 回答
0

当我们谈到可扩展性时,我们期望或希望听到线性性能提升这个词。老实说,尽管大多数设置并非如此,因为它们对另一个服务器/服务的依赖太大,因此在您尝试为用户托管的网络中形成了瓶颈。

当我们探索选项时,我们会听到诸如数据库、消息队列和代理之类的东西;这些都可以使用,但如上所述,如果对其中任何一个的依赖太大,您将在一定时间内破坏您的设置。


将 WSS 服务器设计为单独运行(除非超出要求)。您确定并设置限制并让 API 服务器知道这一点。因此,如果我有 10 个聊天室,并且它们最多可容纳 100 个用户,并且我的 WSS 服务器测试证明我可以容纳 400-500 个。有了这些信息,我会为每台服务器设置 4-5 个房间。因此,如果两个人进入房间#1,他们就在 WSS 服务器#1 上;如果所有 10 个聊天室都已满,则 WSS​​ 服务器#2 现在已满,第 11 个房间将需要 WSS 服务器#3 到第 15 个房间。

网络中最慢的部分现在只是您的 API 服务器处理请求,但这也可能包括数据库。


如果您的要求是比示例更多的用户,您可以先增加核心功率或借助 MQ 或 Redis Pub/Sub 类型设置添加第二台服务器。


不幸的是,没有办法正确地对用户进行分类,所以如果 3 个房间有 20 个用户并且所有用户都坐在 WSS 服务器#1 上,那么仍然会留下一个房间有数百个可用的用户插槽,但这真的是个问题吗?

这个房间可能会填满,所以让他们留在原地,但仍然可能需要几天时间才能达到最大值,因此根据您的需求编写一些辛辣的东西将提高您制作它的成本效益。

于 2021-12-13T13:18:11.047 回答