[转帖]关于一个 websocket 多节点分布式问题的头条前端面试题
关于一个 websocket 多节点分布式问题的头条前端面试题
https://juejin.im/post/5dcb5372518825352f524614
你来说说 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 如何向特定的用户组推送消息?
假如一个学校有以下数据结构
Class: 代表班级Student: 代表学生,每个学生都在其中一个班级
那假如要向 Class:201901 班级的所有学生发送通知,应该如何实现
欢迎在 Issue 中讨论: 【Q029】websocket 如何向特定用户组推送消息
小结
借用解决方案的图作为小结
[转帖]关于一个 websocket 多节点分布式问题的头条前端面试题的更多相关文章
- 关于一个 websocket 多节点分布式问题的头条面试题
原文链接,欢迎讨论: [Q023]websocket 服务多节点部署时会有什么问题,怎么解决 你来说说 websocket 有什么用 双向通信,服务器端可以主动 push,给客户端发送通知 那webs ...
- 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?
昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...
- 前端面试题-WebSocket的实现和应用
(1)什么是WebSocket? WebSocket是HTML5中的协议,支持持久连续,http协议不支持持久性连接.Http1.0和HTTP1.1都不支持持久性的链接,HTTP1.1中的keep-a ...
- WEB前端面试题 分别使用2个、3个、5个DIV画出一个大的红十字
<!DOCTYPE html> <!--两个DIV--> <html> <body> <div style="width:100%;he ...
- 一道前端面试题:定义一个方法将string的每个字符串间加个空格返回,调用的方式'hello world'.spacify();
偶然在群里看到了这道题:定义一个方法将string的每个字符串间加个空格返回,调用的方式'hello world'.spacify(); 这道题主要是对JavaScript对象原型的考察.
- Hadoop2.2.0多节点分布式安装及测试
众所周知,hadoop在10月底release了最新版2.2.很多国内的技术同仁都马上在网络上推出了自己对新版hadoop的配置心得.这其中主要分为两类: 1.单节点配置 这个太简单了,简单到只要懂点 ...
- Facebook的实时流处理技术——Scuba是Facebook的一个非常快速、分布式的内存数据库,用于实时分析和查询
Scuba,Facebook的一个非常快速.分布式的内存数据库,用于实时分析和查询.是Facebook的回归分析代码.错误报告监控.广告收入监控和性能调试的背后主力. Facebook的实时流处理技术 ...
- kafka系列二:多节点分布式集群搭建
上一篇分享了单节点伪分布式集群搭建方法,本篇来分享一下多节点分布式集群搭建方法.多节点分布式集群结构如下图所示: 为了方便查阅,本篇将和上一篇一样从零开始一步一步进行集群搭建. 一.安装Jdk 具体安 ...
- [转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)
Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA 学长的文章.. ...
随机推荐
- wiki with 35(dp+矩阵快速幂)
Problem J. Wiki with 35Input file: standard input Time limit: 1 secondOutput file: standard output M ...
- [Javascript] Sort by multi factors
For example, we have a 2D arrays; const arys = [ [], [], [] ]; We want to sort by the number first, ...
- A Class of Blind Source Extraction Method Using Second-Order Statistics
基于二阶统计量的盲源提取方法[1]. 文中提出了一系列基于二阶统计量的算法,包括离线BSE和在线BSE算法,可以提取平稳信号和非平稳信号.这些算法中,通过挖掘信号特征,提出了新的打分函数,以及一个无参 ...
- Bootstrap Method
bootstrap方法是一种重采样技术,用于通过抽样数据集来估计总体统计数据.是一种面向应用的.基于大量计算的统计思维——模拟抽样统计推断. 它可以用来估计统计数据,例如平均值或标准差.在应用机器学习 ...
- JS 不声明第三个变量的情况下实现两数变换
1. var a = 1; var b = 2; a = a + b; b = a - b; a = a - b; console.log(a); console.log(b); 2. var a = ...
- hibernate之一对多关系
1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: public class A{ private B b ...
- codevs 1814 最长链题解
codevs 1814 最长链题解 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Descripti ...
- 均值不等式中的一则题目$\scriptsize\text{$(a+\cfrac{1}{a})^2+(b+\cfrac{1}{b})^2\ge \cfrac{25}{2}$}$
例题已知正数\(a.b\)满足条件\(a+b=1\),求\((a+\cfrac{1}{a})^2+(b+\cfrac{1}{b})^2\)的最小值: 易错方法\((a+\cfrac{1}{a})^2+ ...
- git sh.exe 乱码
其实很简单,只需要在 git 安装目录中的 etc 目录下修改 bash.bashrc 文件. 在该文件头部加入: export LANG=zh_CN.utf-8alias ls='ls --show ...
- Koa 操作 Mongodb 数据库
node-mongodb-native的介绍 使用基于官方的 node-mongodb-native 驱动,封装一个更小.更快.更灵活的 DB 模块, 让我们用 nodejs 操作 Mongodb 数 ...