【问题标题】:Scaling websocket node server扩展 websocket 节点服务器
【发布时间】:2014-03-01 04:51:28
【问题描述】:

我知道这个问题之前已经部分被问过(How to Scale Node.js WebSocket Redis Server?),但我想知道是否有任何替代 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 读回套接字后,我从节点收到一个错误,说“对象对象没有方法发送”,并且对它进行了再循环。任何帮助将不胜感激。

提前致谢,詹姆斯。

【问题讨论】:

  • 我有点不确定你想要达到什么目的。你到底是什么意思共享 websocket 对象?您是否正在尝试构建一个聊天系统并且您正在使用 redis 来存储 websocket 连接信息并将该信息用于聊天目的?
  • 我基本上是在构建一个允许将消息从 android 手机传递到 chrome 扩展的系统。目前,我有一组浏览器套接字和一组本地存储在节点中的 android 套接字。问题是如果我启动多个节点实例并且用户浏览器和电话连接到不同的实例,则无法将消息转发到它打算去的地方。希望澄清,詹姆斯。 @Atul

标签: json node.js websocket redis node-redis


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复,我不确定它是否完全解决了我的问题,但我认为 rabbitMQ 等可以回答。谢谢詹姆斯。
  • 对不起,我一直在想,我回来了,真正的问题是 Redis、RabbitMQ 等都发送文本消息/PubSub 消息,因此在尝试发送 ws 对象时会出现问题( github.com/einaros/ws) 因为它们很难字符串化。是否有任何强大的解决方案。
  • 您到底想做什么?您想向连接到节点服务器的所有用户广播消息吗?还是您想向特定用户发送消息?
  • 嗨,这是给特定用户的。
  • @JackM。我建议你使用消息队列(RabbitMQ、ActiveMQ、ZeroMQ 等)而不是 Redis。
【解决方案2】:

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

https://github.com/ClusterWS/ClusterWS

【讨论】:

    【解决方案3】:

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

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


    将 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 上,那么仍然会留下一个房间有数百个可用的用户插槽,但这真的是个问题吗?

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

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2016-12-18
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多