关于一个 websocket 多节点分布式问题的头条面试题
原文链接,欢迎讨论: 【Q023】websocket 服务多节点部署时会有什么问题,怎么解决
你来说说 websocket 有什么用
双向通信,服务器端可以主动 push,给客户端发送通知
那websocket多个节点有什么问题?
头条面试官的提问让我的回忆飘到了一个下午,想起了我两个同事之间的对话
引子
咱有部分用户收不到通知了
通知是由ws服务控制的,它最近是有啥改动么
也没改啥,以前单个节点也没有问题
想起来了,接上面通知,把服务都从单节点改成了多节点
对,说是为了什么 HA,两位数用户的服务需要折腾吗
没事,这样出去了也有搭建高可用服务与 websocket 负载均衡的经验了
说的倒也是!不过这样确实会有 ws 分布式的问题
简单,加个 reids 就好了
多节点问题
在开始思考分布式会有什么问题时,先来回答一个问题: 服务端如何与客户端交流?
在 ws 服务端,当与客户端连接成功后,会生成一个对象 connection
,ws 会维护一个与客户端所有连接的 connections
。如果想要主动推送消息到客户端,只需要调用API connection.sendText(message)
。
那如何给所有人广播消息呢?
服务器只需要与它自身的所有连接 server.connections
挨个发消息就是广播,所以它只是一个伪广播:我要给群里所有人发消息,但我不能在群里发,只能挨个私发。
单节点
当单节点时所有用户都能正常受到通知,流程如下
这时所有用户都能收到消息通知
多节点
当多节点时,就会有部分用户无法正常受到通知,从以下流程图中可以很清楚地看到问题所在
负载到节点2的所有用户都没有收到消息通知
如何解决
多节点服务器就会有分布式问题,解决分布式问题就找一个大家都能找到的地,比如说 Redis
,比如说 Kafka
等消息件
改进后流程图如下
- 需要向所有用户推送消息,请求 websocket 服务
- 负载均衡到某个节点
- 该节点向 redis/kafka 推送消息: 向所有用户推送消息通知
- 所有节点在 redis/kafka 上订阅消息
- 订阅成功后所有节点向客户端 push 消息
redis PUBSUB
其中有一个细节是 pub/sub 那里,redis 的 pubsub
较 Kafka
等消息中间件更为轻便,最主要的是与ws集成的社区方案比较成熟,这点很重要,如 Node 中的以下两个
pubsub
在 redis 中的命令如下
- pub:
publish channel message
- sub:
subscribe
如果我们要订阅 eat
这个 channel
的话,图示如下
小结
借用解决方案的图作为小结
关于一个 websocket 多节点分布式问题的头条面试题的更多相关文章
- [转帖]关于一个 websocket 多节点分布式问题的头条前端面试题
关于一个 websocket 多节点分布式问题的头条前端面试题 https://juejin.im/post/5dcb5372518825352f524614 你来说说 websocket 有什么用? ...
- Hadoop2.2.0多节点分布式安装及测试
众所周知,hadoop在10月底release了最新版2.2.很多国内的技术同仁都马上在网络上推出了自己对新版hadoop的配置心得.这其中主要分为两类: 1.单节点配置 这个太简单了,简单到只要懂点 ...
- Facebook的实时流处理技术——Scuba是Facebook的一个非常快速、分布式的内存数据库,用于实时分析和查询
Scuba,Facebook的一个非常快速.分布式的内存数据库,用于实时分析和查询.是Facebook的回归分析代码.错误报告监控.广告收入监控和性能调试的背后主力. Facebook的实时流处理技术 ...
- kafka系列二:多节点分布式集群搭建
上一篇分享了单节点伪分布式集群搭建方法,本篇来分享一下多节点分布式集群搭建方法.多节点分布式集群结构如下图所示: 为了方便查阅,本篇将和上一篇一样从零开始一步一步进行集群搭建. 一.安装Jdk 具体安 ...
- 一个由INode节点爆满引起的业务故障
一个由INode节点爆满引起的业务故障 http://2358205.blog.51cto.com/2348205/1747951 好久没有写博文了,今天周六,分享一下刚刚处理完的一个小故障 现象描述 ...
- 实现一个websocket服务器-理论篇
本文是Writing WebSocket servers的中文文档,翻译自MDNWriting WebSocket servers.篇幅略长,个人能力有限难免有所错误,抛砖引玉共同进步. websoc ...
- node实现一个WEBSOCKET服务器
早点时候翻译了篇实现一个websocket服务器-理论篇,简单介绍了下理论基础,本来打算放在一起,但是感觉太长了大家可能都看不下去.不过发现如果拆开的话,还是不可避免的要提及理论部分.用到的地方就简要 ...
- [Swift]LeetCode1019. 链表中的下一个更大节点 | Next Greater Node In Linked List
We are given a linked list with head as the first node. Let's number the nodes in the list: node_1, ...
- XPATH如何选择不包含某一个属性的节点?
XPATH如何选择不包含某一个属性的节点?今天博主在写一个爬虫的时候就碰到了这个问题. 我们知道选择包含某一特定属性的节点,可以使用例如//tbody/tr[@class]来选择.那么不含某属性的节点 ...
随机推荐
- B-微积分-Sigmoid函数
目录 Sigmoid函数 一.Sigmoid函数详解 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnbl ...
- .netCore+Vue 搭建的简捷开发框架--目录
.netCore+Vue 搭建的简捷开发框架 .netCore+Vue 搭建的简捷开发框架 (2)--仓储层实现和EFCore 的使用 .netCore+Vue 搭建的简捷开发框架 (3)-- Ser ...
- Attention机制全解
前言 之前已经提到过好几次Attention的应用,但还未对Attention机制进行系统的介绍,之后的实践模型attention将会用到很多,因此这里对attention机制做一个总结. Seq2S ...
- Flink整合oozie shell Action 提交任务 带kerberos认证
最近这段时间一直在忙新集群迁移,上了最新的cdh6.3.0 于是Flink 提交遇到了许多的问题 还好有cloudera License 有了原厂的帮助和社区的伙伴,问题解决起来快了不少,手动滑稽 集 ...
- mysql连接方法
一.MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) mysql -h localhost -u root -p123或mysql -u ...
- React+Antd+Antd-Img-Crop实现上传固定大小的裁剪头像或者图片(且可控制图片数量)
见章知著 1024,程序员们节日快乐!本文主要讲述react配合antd以及react-img-crop第三方库实现一个可控的图片上传功能. 运行项目 需要具有node环境 第三方库安装 1.antd ...
- ubuntu16.04安装zlib
sudo apt-get install zlib1g-dev 下载:libzip-1.0.1.tar.gztar zxcv libzip-1.0.1.tar.gzcd libzip-1.0.1./c ...
- xshell rz commend not found
sudo apt-get install lrzsz 上传rz 下载sz
- Linux本地内核提权漏洞复现(CVE-2019-13272)
Linux本地内核提权漏洞复现(CVE-2019-13272) 一.漏洞描述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_c ...
- ggstatsplot绘图|统计+可视化,学术科研神器
本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/zdSit97SOEpbnR18ARzixw 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ...