Sockets 使用消息队列扩展WebSocket

Sockets 使用消息队列扩展WebSocket,sockets,websocket,rabbitmq,zeromq,publish-subscribe,Sockets,Websocket,Rabbitmq,Zeromq,Publish Subscribe,我已经构建了一个WebSockets服务器,充当聊天信息路由器(即从客户端接收消息,并根据客户端ID将消息推送到其他客户端) 这要求服务能够扩展以处理数百万并发的开放套接字连接,我希望能够水平扩展服务器 我想到的架构是将websocket服务器节点放在负载平衡器后面,这会产生问题,因为连接到不同节点的客户端彼此不了解。当客户端A和B通过LoadBalancer进入时,客户端A可能与节点1有开放连接,而客户端B连接到节点2——每个节点都拥有自己的开放套接字连接字典 为了解决这个问题,我考虑使用一些

我已经构建了一个
WebSockets
服务器,充当聊天信息路由器(即从客户端接收消息,并根据客户端
ID
将消息推送到其他客户端)

这要求服务能够扩展以处理数百万并发的开放套接字连接,我希望能够水平扩展服务器

我想到的架构是将websocket服务器节点放在负载平衡器后面,这会产生问题,因为连接到不同节点的客户端彼此不了解。当客户端
A
B
通过
LoadBalancer
进入时,客户端
A
可能与节点
1
有开放连接,而客户端
B
连接到节点
2
——每个节点都拥有自己的开放套接字连接字典

为了解决这个问题,我考虑使用一些MQ系统,比如
ZeroMQ
RabbitMQ
。所有websocket服务器节点都将是MQ服务器的订户,当节点收到将消息路由到不在本地连接字典中的客户端的请求时,它将向MQ服务器发布消息,这将告诉所有
子节点
-scriber节点查找此客户端,并在其连接到该节点时发出消息

Q1:
这种架构有意义吗

Q2:
这里描述的
发布订阅模式是否真的是我想要的?

ZeroMQ将是我的选择—无论是架构还是性能方面 --快速低延迟(可以测量您的实现性能和开销,精确到次[usec]规模)

--无代理(不会引入另一个故障点,而本身可以有{N+1 | N+M}自愈架构)

--smart可供使用的正式通信模式原语(
PUB
/
是最基本的原语)

--公平队列和负载平衡体系结构内置(外部观察者看不见)

--许多传输类,用于服务器端内部多进程/多线程分布式/并行处理

--准备好几乎线性可伸缩性

自适应节点重新发现 这是一个比较复杂的问题。您想要创建一个可行的体系结构,必须深入到更多的细节中去解决

  • 节点身份验证与对等消息传递
  • 节点(重新)-发现与法律和隐私问题
  • 基于节点的自治自组织代理与中央策略实施需求

为了在2021年更新,我们刚刚解决了这个问题,我们需要设计一个能够处理来自物联网设备的数百万同时WS连接的系统。WS-server只是将消息中继到处理实际逻辑的无服务器API后端。我们选择使用docker和node
ws
包,该包使用自动缩放的AWS ECS Fargate集群,前面有一个ALB

这解决了路由消息的主要问题,但接下来我们遇到了如何路由来自服务器的响应消息的相同问题。我们最初只想保留一个连接的中央数据库,但将消息路由到ALB后面的特定Fargate实例似乎不可行


相反,我们使用AWS SNS()设置了一个简单的sub/pub模式。每个WS-server都会收到响应,然后搜索自己的WS-connections。由于每个Fargate实例只处理路由(无逻辑),因此当我们垂直扩展它们时,它们可以处理大量连接。

您正在构建聊天室吗?您还需要将消息重定向到移动设备吗?是的(该系统类似于聊天,应该可以在Chrome for Android上运行)它只是OT,但您是否考虑过使用XMPP?@Gas我希望能够使用WebSocket(客户端->负载平衡器->WS_nodeA->MQ->WS_nodeB->客户端B)直接从html客户端连接到该服务因此,就我所知,XMPP不是一个选项。你能建议一些资源,让人们学习如何扩展ZMQ吗?非常感谢。