我在 github 上新建了一个仓库 日问 ,每天一道面试题,有关前端,后端,devops以及软技能,促进职业成长,敲开大厂之门,欢迎交流
并且记录我的面试经验
ali 为 ali,为避内容检查
计算机网络 | 算法与数据结构 | 操作系统 | Linux基础 | http | vim | git
CSS | Javascript | html | React | Vue | Webpack | 前端工程化
后端基础 | 数据库 | Redis | 微服务架构
DevOps | Docker | kubernetes
开放式问题
查看所有问题
在 Issue 中交流与讨论: Issue 地址
sentry
,如果有在 sentry
中查看堆栈信息以及相关上下文,定位代码 zipkin
。从 sentry
中找到 requestId
,在数据库日志/上下游链路日志中查找对应 requestId
的日志 既然报错,那么一定会在异常上报系统中找到 Issue
进行定位。最怕的是那种接口没报错,但是业务方反馈数据有误的问题了,只能开了 debug,进行代码调试了
更多描述: 后端的敏感数据在生产环境是如何配置的,如数据库的账号密码,jwt 的 secret,联调上游服务的 token 等
在 Issue 中交流与讨论: Issue 地址
目前我们的方式是在每次部署之前,在 vault 和 consul 拉取敏感数据,写在配置文件中
另外,还有几种可选的方案
CI/CD
的环境变量,敏感配置放在 CI 平台 secret
/ configMap
,敏感配置放在 k8s 集群 consul
/ vault
在 Issue 中交流与讨论: Issue 地址
在 Issue 中交流与讨论: Issue 地址
在开始思考分布式会有什么问题时,先来回答一个问题: 服务端如何与客户端交流?
在 ws 服务端,当与客户端连接成功后,会生成一个对象 connection
,ws 会维护一个与客户端所有连接的 connections
。如果想要主动推送消息到客户端,只需要调用API connection.sendText(message)
。
那如何给所有人广播消息呢?
服务器只需要与它自身的所有连接 server.connections
挨个发消息就是广播,所以它只是一个伪广播:我要给群里所有人发消息,但我不能在群里发,只能挨个私发。
当单节点时所有用户都能正常受到通知,流程如下
这时所有用户都能收到消息通知
当多节点时,就会有部分用户无法正常受到通知,从以下流程图中可以很清楚地看到问题所在
多节点服务器就会有分布式问题,解决分布式问题就找一个大家都能找到的地,比如说 Redis
,比如说 Kafka
等消息件
改进后流程图如下
其中有一个细节是 pub/sub 那里,redis 的 pubsub
较 Kafka
等消息中间件更为轻便, 最主要的是与ws集成的社区方案比较成熟,这点很重要 ,如 Node 中的以下两个
pubsub
在 redis 中的命令如下
publish channel message subscribe
如果我们要订阅 eat
这个 channel
的话,图示如下
面试官见我回答完问题后,又一次追问
假如一个学校有以下数据结构
Class Student
那假如要向 Class:201901
班级的所有学生发送通知,应该如何实现
欢迎在 Issue 中讨论: 【Q029】websocket 如何向特定用户组推送消息
借用解决方案的图作为小结
在 Issue 中交流与讨论: Issue 地址
$ ab 复制代码
Class Student
那假如要向 Class:201901
班级的所有学生发送通知,应该如何实现
在 Issue 中交流与讨论: Issue 地址
在 redis
处维护一个对象,记录每个 group 所对应的 connections
/ sockets
{ 'Class:201901': [student1Socket, student2Socket] } 复制代码
当 client 刚连入 server 时,便加入某个特定的组,或者叫 room,比如 student01,刚开始连入 server,可能要加入 room: Student:01
, Class:201901
, Group:10086
在 Issue 中交流与讨论: Issue 地址
一般采用漏桶算法:
可以使用 redis
的计数器实现
当然,这只是大致思路,这时会有两个问题要注意
不过实际实现时注意以下就好了(话说一般也是调用现成的三方库做限流...),可以参考我以前的文章 shanyue.tech/post/rate-l…