Kubernetes 处理连接到不同副本的websocket连接
后端正在kubernetes上运行,它有N个副本。 前端用户(浏览器)监听websocket以获取实时消息 因为后端有N个副本,所以每个浏览器连接到不同的副本。 假设有用户A B C,所有用户都打开了两个选项卡,A1 A2 B1 B2 C1 C2 Backend-replica-1可以保存A1 B1的websocket连接 Backend-replica-2可以保存A2 B2 C1 C2的websocket连接 (如果我在这里之前错了,请纠正我。但是,据我所知和测试,这就是它的工作原理) 为了向所有用户广播消息,我向RabbiqMQ发布了一个通知,其中包含我想要的消息。我正在使用扇出exchange,因此每个后端副本都将使用该通知。然后,每个服务器将消息发送给它拥有的所有用户(连接) 一个问题是,这是正确的方法还是有更好的方法?使用单独的服务器只处理WS连接是否更明智 现在,我需要一个解决方案来检测用户是否关闭了所有选项卡(离开应用程序),并在db中更新该用户。我最初的想法是检测websocket断开事件,检查用户是否还有任何活动连接。但这样做似乎非常复杂,因为用户可能打开了3个选项卡,每个选项卡连接到不同的后端服务器Kubernetes 处理连接到不同副本的websocket连接,kubernetes,websocket,microservices,replication,Kubernetes,Websocket,Microservices,Replication,后端正在kubernetes上运行,它有N个副本。 前端用户(浏览器)监听websocket以获取实时消息 因为后端有N个副本,所以每个浏览器连接到不同的副本。 假设有用户A B C,所有用户都打开了两个选项卡,A1 A2 B1 B2 C1 C2 Backend-replica-1可以保存A1 B1的websocket连接 Backend-replica-2可以保存A2 B2 C1 C2的websocket连接 (如果我在这里之前错了,请纠正我。但是,据我所知和测试,这就是它的工作原理) 为了向
任何人都知道如何实现它吗?要跟踪谁连接了以及谁关闭了所有选项卡,您需要一个类似DB的实例。当有人连接或断开连接时,您只需将事件发布到该实例 一个简单的实现是使用一个字典,其中用户标识符作为键,会话数作为值 当用户连接到websocket时,您将发布一个增加会话数的
connected
事件
当用户断开连接时,您将发布一个disconnected
事件,该事件会减少会话数并返回剩余会话数,如果会话数等于0,则返回布尔值。然后你可以做任何你需要做的事情来清理他的会议
注意:如果将有多个线程接收事件,则需要使写入操作同步。一个好的解决方案是使用SQL数据库,它支持现成的ACID
如果需要更多的控制,可以扩展解决方案,使其具有发布-订阅体系结构。其中连接是双向的,而不是上述单向方法。这样,如果有人在另一个选项卡中连接,您可以与第一个选项卡交互,并根据您的需要显示消息或断开连接。要跟踪谁连接了以及谁关闭了所有选项卡,您需要一个类似DB的实例。当有人连接或断开连接时,您只需将事件发布到该实例 一个简单的实现是使用一个字典,其中用户标识符作为键,会话数作为值 当用户连接到websocket时,您将发布一个增加会话数的
connected
事件
当用户断开连接时,您将发布一个disconnected
事件,该事件会减少会话数并返回剩余会话数,如果会话数等于0,则返回布尔值。然后你可以做任何你需要做的事情来清理他的会议
注意:如果将有多个线程接收事件,则需要使写入操作同步。一个好的解决方案是使用SQL数据库,它支持现成的ACID
如果需要更多的控制,可以扩展解决方案,使其具有发布-订阅体系结构。其中连接是双向的,而不是上述单向方法。这样,如果有人在另一个选项卡中连接,您可以与第一个选项卡交互,并根据需要显示消息或断开连接