ELB上的Socket io需要连接到应用程序服务器的所有实例

Ima*_*Ima 7 sockets amazon-ebs node.js socket.io

基于套接字的事件推送架构 我有一个在节点js上编写的套接字服务器应用程序,托管在Amazon EBS(Elastic bean stalk)上,由负载均衡器管理

客户端连接到套接字并传递指定的id,比如event_id我的应用程序创建名为"event_ event_id"的房间并加入房间.不同的客户有不同的"event_id"

lambda函数连接到套接字并向应用程序发出名为"event_push"的事件,并使用必要的数据(如event_id)

每当我的套接字应用程序(在EBS中的一个实例中)检测到推送事件时event_id,它将推送的数据广播到房间的所有成员"event_ event_id",因此所有成员都会收到有关该事件的通知

客户端可以连接任何服务器,由负载均衡器和粘性会话决定可以保持连接

现在我的问题:有没有办法发出了"event_push",只为服务器已经命名为"event_的房间event_id"

问:有没有办法向EBS中的所有服务器实例发送事件?或Qn:还有其他解决方案吗?

Asi*_*eed 0

您可以做的是使用 Redis 或 mongoDb 来保存有关您的案例 event_event_id 的一些信息。您可以将此信息保存在数据存储中,例如示例文档

{
   _id : ObjectId,
   userId : 23,
   event : event_event_id,
   server : 1
},
{
   _id : ObjectId,
   userId : 23,
   event : event_event_id,
   server : 2
}
Run Code Online (Sandbox Code Playgroud)

现在,您将获得哪个事件属于哪个服务器的信息。现在,如果负载均衡器将服务器 1 的请求发送到服务器 2 并且服务器 2 无法识别该请求,您可以在服务器之间创建一个通信通道(您可以使用 socketio、微服务或任何东西)并将该请求重定向到服务器 1,以便它可以触发该特定套接字事件。

当触发断开事件时,您必须从 mongo 或 redis 中删除套接字 id。