Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 处理连接到不同副本的websocket连接_Kubernetes_Websocket_Microservices_Replication - Fatal编程技术网

Kubernetes 处理连接到不同副本的websocket连接

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连接 (如果我在这里之前错了,请纠正我。但是,据我所知和测试,这就是它的工作原理) 为了向

后端正在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个选项卡,每个选项卡连接到不同的后端服务器


任何人都知道如何实现它吗?

要跟踪谁连接了以及谁关闭了所有选项卡,您需要一个类似DB的实例。当有人连接或断开连接时,您只需将事件发布到该实例

一个简单的实现是使用一个字典,其中用户标识符作为键,会话数作为值

当用户连接到websocket时,您将发布一个增加会话数的
connected
事件

当用户断开连接时,您将发布一个
disconnected
事件,该事件会减少会话数并返回剩余会话数,如果会话数等于0,则返回布尔值。然后你可以做任何你需要做的事情来清理他的会议

注意:如果将有多个线程接收事件,则需要使写入操作同步。一个好的解决方案是使用SQL数据库,它支持现成的ACID


如果需要更多的控制,可以扩展解决方案,使其具有发布-订阅体系结构。其中连接是双向的,而不是上述单向方法。这样,如果有人在另一个选项卡中连接,您可以与第一个选项卡交互,并根据您的需要显示消息或断开连接。

要跟踪谁连接了以及谁关闭了所有选项卡,您需要一个类似DB的实例。当有人连接或断开连接时,您只需将事件发布到该实例

一个简单的实现是使用一个字典,其中用户标识符作为键,会话数作为值

当用户连接到websocket时,您将发布一个增加会话数的
connected
事件

当用户断开连接时,您将发布一个
disconnected
事件,该事件会减少会话数并返回剩余会话数,如果会话数等于0,则返回布尔值。然后你可以做任何你需要做的事情来清理他的会议

注意:如果将有多个线程接收事件,则需要使写入操作同步。一个好的解决方案是使用SQL数据库,它支持现成的ACID

如果需要更多的控制,可以扩展解决方案,使其具有发布-订阅体系结构。其中连接是双向的,而不是上述单向方法。这样,如果有人在另一个选项卡中连接,您可以与第一个选项卡交互,并根据需要显示消息或断开连接