繁体   English   中英

扩展 websocket 节点服务器

[英]Scaling websocket node server

我知道之前已经部分地问过这个问题( 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 读回套接字并对其进行回收后,“对象对象没有发送方法”。 任何帮助将非常感激。

提前致谢,詹姆斯。

海事组织,你应该为此使用消息队列。.例如(RabbitMQ)

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

因此,您所需要做的就是将消息传递队列放入您的体系结构(RabbitMQ,ZeroMQ)等中

有一个库可以轻松在node.js进程和机器之间扩展WebSocket,您可以签出:

https://github.com/ClusterWS/ClusterWS

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

当我们探索选项时,我们会听到诸如数据库、消息队列和代理之类的东西; 这些很好用,但如上所述,如果对它们中的任何一个过于依赖,你肯定会破坏你的设置。


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

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


如果您的要求是比示例更多的用户,您可以首先增加核心能力或在 MQ 或 Redis Pub/Sub 类型设置的帮助下添加第二个服务器。


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM