关于一个 websocket 多节点分布式问题的面试题

2021-09-26 18:14

阅读:1176

标签:控制   中间   mes   eid   比较   面试题   回忆   text   也有   你来说说 websocket 有什么用 双向通信,服务器端可以主动 push,给客户端发送通知 那websocket多个节点有什么问题? 头条面试官的提问让我的回忆飘到了一个下午,想起了我两个同事之间的对话 引子 咱有部分用户收不到通知了 通知是由ws服务控制的,它最近是有啥改动么 也没改啥,以前单个节点也没有问题 想起来了,接上面通知,把服务都从单节点改成了多节点 对,说是为了什么 HA,两位数用户的服务需要折腾吗 没事,这样出去了也有搭建高可用服务与 websocket 负载均衡的经验了 说的倒也是!不过这样确实会有 ws 分布式的问题 简单,加个 reids 就好了 多节点问题 在开始思考分布式会有什么问题时,先来回答一个问题: 服务端如何与客户端交流? 在 ws 服务端,当与客户端连接成功后,会生成一个对象 connection ,ws 会维护一个与客户端所有连接的 connections 。如果想要主动推送消息到客户端,只需要调用API connection.sendText(message) 。 那如何给所有人广播消息呢? 服务器只需要与它自身的所有连接 server.connections 挨个发消息就是广播,所以它只是一个伪广播:我要给群里所有人发消息,但我不能在群里发,只能挨个私发。 单节点 当单节点时所有用户都能正常受到通知,流程如下 这时所有用户都能收到消息通知 多节点 当多节点时,就会有部分用户无法正常受到通知,从以下流程图中可以很清楚地看到问题所在 负载到节点2的所有用户都没有收到消息通知 如何解决 多节点服务器就会有分布式问题,解决分布式问题就找一个大家都能找到的地,比如说 Redis,比如说 Kafka 等消息件 改进后流程图如下 1.需要向所有用户推送消息,请求 websocket 服务2.负载均衡到某个节点3.该节点向 redis/kafka 推送消息: 向所有用户推送消息通知4.所有节点在 redis/kafka 上订阅消息5.订阅成功后所有节点向客户端 push 消息 redis PUBSUB 其中有一个细节是 pub/sub 那里,redis 的 pubsub 较 Kafka 等消息中间件更为轻便, 最主要的是与ws集成的社区方案比较成熟,这点很重要 ,如 Node 中的以下两个 graphql subscriptions - redissocket.io-redispubsub 在 redis 中的命令如下 publish channel message subscribe 如果我们要订阅 eat 这个 channel 的话,图示如下 小结 借用解决方案的图作为小结关于一个 websocket 多节点分布式问题的面试题标签:控制   中间   mes   eid   比较   面试题   回忆   text   也有   原文地址:https://blog.51cto.com/14528283/2449984


评论


亲,登录后才可以留言!