我在 github 上新建了一个仓库 日问,每天一道面试题,有关前端,后端,devops以及软技能,促进职业成长,敲开大厂之门,欢迎交流
并且记录我的面试经验
ali 为 ali,为避内容检查
以下是总结的问题,我将在本周末补充答案,另外也欢迎各位补充答案
分类
计算机与编程基础
计算机网络 | 算法与数据结构 | 操作系统 | Linux基础 | http | vim | git
前端
CSS | Javascript | html | React | Vue | Webpack | 前端工程化
后端
DevOps
DevOps | Docker | kubernetes
开放式问题
历史记录
01 生产环境的某个接口报错,如何定位
在 Issue 中交流与讨论: Issue 地址
- 测试环境有没有问题,有问题可以在测试环境测试
- 有没有异常报警系统,如
sentry
,如果有在sentry
中查看堆栈信息以及相关上下文,定位代码 - 如果堆栈信息不足够找到问题,看有没有链路追踪工具,如
zipkin
。从sentry
中找到requestId
,在数据库日志/上下游链路日志中查找对应requestId
的日志 - 查看接口相关代码
既然报错,那么一定会在异常上报系统中找到 Issue
进行定位。怕的是那种接口没报错,但是业务方反馈数据有误的问题了,只能开了 debug,进行代码调试了
02 后端的敏感数据在生产环境是如何配置的
更多描述: 后端的敏感数据在生产环境是如何配置的,如数据库的账号密码,jwt 的 secret,联调上游服务的 token 等
在 Issue 中交流与讨论: Issue 地址
目前我们的方式是在每次部署之前,在 vault 和 consul 拉取敏感数据,写在配置文件中
另外,还有几种可选的方案
- 跟随
CI/CD
的环境变量,敏感配置放在 CI 平台 - 跟随 k8s
secret
/configMap
,敏感配置放在 k8s 集群 - 跟随专有的配置服务,如
consul
/vault
03 如何实现一个分布式锁
在 Issue 中交流与讨论: Issue 地址
04 websocket 服务多节点部署时会有什么问题,怎么解决
在 Issue 中交流与讨论: Issue 地址
多节点问题
在开始思考分布式会有什么问题时,先来回答一个问题: 服务端如何与客户端交流?
在 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 如何向特定用户组推送消息
小结
借用解决方案的图作为小结
05 如何对接口进行压力测试
在 Issue 中交流与讨论: Issue 地址
$ ab
复制代码
06 websocket 如何向特定的用户组推送消息
更多描述: 假如一个学校有以下数据结构
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
07 如何对接口进行限流
在 Issue 中交流与讨论: Issue 地址
一般采用漏桶算法:
- 漏桶初始为空
- API 调用是在往漏桶里注水
- 漏桶会以一定速率出水
- 水满时 API 拒绝调用
可以使用 redis
的计数器实现
- 计数器初始为空
- API 调用计数器增加
- 给计数器设置过期时间,隔段时间清零,视为一定速率出水
- 计数器达到上限时,拒绝调用
当然,这只是大致思路,这时会有两个问题要注意
- 坏情况下的限流是额定限流速率的2倍
- 条件竞争问题
不过实际实现时注意以下就好了(话说一般也是调用现成的三方库做限流...),可以参考我以前的文章 shanyue.tech/post/rate-l…
08 如何设计一个高并发系统
在 Issue 中交流与讨论: Issue 地址
09 什么是服务降级
在 Issue 中交流与讨论: Issue 地址
10 什么是熔断机制,微服务如何做熔断
在 Issue 中交流与讨论: Issue 地址
11 什么是负载均衡
在 Issue 中交流与讨论: Issue 地址
12 四层负载均衡与七层负载均衡有什么区别
在 Issue 中交流与讨论: Issue 地址
13 你们项目中的计划任务是如何组织的
在 Issue 中交流与讨论: Issue 地址
14 RPC 与 REST 有什么优劣
在 Issue 中交流与讨论: Issue 地址
15 如何实现服务发现 (Service Discovery)
在 Issue 中交流与讨论: Issue 地址
那 k8s 的服务发现是如何实现的
16 如何设计一个短网址生成服务
在 Issue 中交流与讨论: Issue 地址
17 你们后端代码上线部署一次需要多长时间
在 Issue 中交流与讨论: Issue 地址
18 什么是 Basic Auth 和 Digest Auth
在 Issue 中交流与讨论: Issue 地址
19 如何保证内网服务的安全性
更多描述: 如 `gitlab CE` 经常暴露出重大漏洞,而它也只需要在公司内部使用。部署 `gitlab` 时我们如何保证它的安全性
在 Issue 中交流与讨论: Issue 地址
basic auth,digest auth,ip whitelist,vpn
20 负载均衡有哪几种方式,它们的原理是什么
在 Issue 中交流与讨论: Issue 地址