绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
大厂微服务及后端基础若干面试题总结
2019-12-27 01:29:11

我在 github 上新建了一个仓库 日问,每天一道面试题,有关前端,后端,devops以及软技能,促进职业成长,敲开大厂之门,欢迎交流

并且记录我的面试经验

ali 为 ali,为避内容检查

以下是总结的问题,我将在本周末补充答案,另外也欢迎各位补充答案

分类

计算机与编程基础

计算机网络 | 算法与数据结构 | 操作系统 | Linux基础 | http | vim | git

前端

CSS | Javascript | html | React | Vue | Webpack | 前端工程化

后端

后端基础 | 数据库 | Redis | 微服务架构

DevOps

DevOps | Docker | kubernetes

开放式问题

开放式问题

历史记录

查看所有问题

01 生产环境的某个接口报错,如何定位

在 Issue 中交流与讨论: Issue 地址

  1. 测试环境有没有问题,有问题可以在测试环境测试
  2. 有没有异常报警系统,如 sentry,如果有在 sentry 中查看堆栈信息以及相关上下文,定位代码
  3. 如果堆栈信息不足够找到问题,看有没有链路追踪工具,如 zipkin。从 sentry 中找到 requestId,在数据库日志/上下游链路日志中查找对应 requestId 的日志
  4. 查看接口相关代码

既然报错,那么一定会在异常上报系统中找到 Issue 进行定位。怕的是那种接口没报错,但是业务方反馈数据有误的问题了,只能开了 debug,进行代码调试了

02 后端的敏感数据在生产环境是如何配置的

更多描述: 后端的敏感数据在生产环境是如何配置的,如数据库的账号密码,jwt 的 secret,联调上游服务的 token 等

在 Issue 中交流与讨论: Issue 地址

目前我们的方式是在每次部署之前,在 vaultconsul 拉取敏感数据,写在配置文件中

另外,还有几种可选的方案

  1. 跟随 CI/CD 的环境变量,敏感配置放在 CI 平台
  2. 跟随 k8s secret/configMap,敏感配置放在 k8s 集群
  3. 跟随专有的配置服务,如 consul/vault

03 如何实现一个分布式锁

在 Issue 中交流与讨论: Issue 地址

04 websocket 服务多节点部署时会有什么问题,怎么解决

在 Issue 中交流与讨论: Issue 地址

多节点问题

在开始思考分布式会有什么问题时,先来回答一个问题: 服务端如何与客户端交流?

在 ws 服务端,当与客户端连接成功后,会生成一个对象 connection,ws 会维护一个与客户端所有连接的 connections。如果想要主动推送消息到客户端,只需要调用API connection.sendText(message)

那如何给所有人广播消息呢?

服务器只需要与它自身的所有连接 server.connections 挨个发消息就是广播,所以它只是一个伪广播:我要给群里所有人发消息,但我不能在群里发,只能挨个私发。

单节点

当单节点时所有用户都能正常受到通知,流程如下

ws 单节点时

这时所有用户都能收到消息通知

多节点

当多节点时,就会有部分用户无法正常受到通知,从以下流程图中可以很清楚地看到问题所在

ws 多节点时

负载到节点2的所有用户都没有收到消息通知

如何解决

多节点服务器就会有分布式问题,解决分布式问题就找一个大家都能找到的地,比如说 Redis,比如说 Kafka 等消息件

改进后流程图如下

  1. 需要向所有用户推送消息,请求 websocket 服务
  2. 负载均衡到某个节点
  3. 该节点向 redis/kafka 推送消息: 向所有用户推送消息通知
  4. 所有节点在 redis/kafka 上订阅消息
  5. 订阅成功后所有节点向客户端 push 消息

借用 redis

redis PUBSUB

其中有一个细节是 pub/sub 那里,redis 的 pubsubKafka 等消息中间件更为轻便,主要的是与ws集成的社区方案比较成熟,这点很重要,如 Node 中的以下两个

pubsub 在 redis 中的命令如下

  • pub: publish channel message
  • sub: subscribe

如果我们要订阅 eat 这个 channel 的话,图示如下

redis pubsub example

进一步追问

面试官见我回答完问题后,又一次追问

那 websocket 如何向特定的用户组推送消息?

假如一个学校有以下数据结构

  1. Class: 代表班级
  2. Student: 代表学生,每个学生都在其中一个班级

那假如要向 Class:201901 班级的所有学生发送通知,应该如何实现

欢迎在 Issue 中讨论: 【Q029】websocket 如何向特定用户组推送消息

小结

借用解决方案的图作为小结

借用 redis

05 如何对接口进行压力测试

在 Issue 中交流与讨论: Issue 地址

$ ab
复制代码

06 websocket 如何向特定的用户组推送消息

更多描述: 假如一个学校有以下数据结构
  1. Class: 代表班级
  2. Student: 代表学生,每个学生都在其中一个班级

那假如要向 Class:201901 班级的所有学生发送通知,应该如何实现

在 Issue 中交流与讨论: Issue 地址

redis 处维护一个对象,记录每个 group 所对应的 connections/sockets

{
  'Class:201901': [student1Socket, student2Socket]
}
复制代码

当 client 刚连入 server 时,便加入某个特定的组,或者叫 room,比如 student01,刚开始连入 server,可能要加入 room:Student:01Class:201901Group:10086

07 如何对接口进行限流

在 Issue 中交流与讨论: Issue 地址

一般采用漏桶算法:

  1. 漏桶初始为空
  2. API 调用是在往漏桶里注水
  3. 漏桶会以一定速率出水
  4. 水满时 API 拒绝调用

漏桶算法

可以使用 redis 的计数器实现

  1. 计数器初始为空
  2. API 调用计数器增加
  3. 给计数器设置过期时间,隔段时间清零,视为一定速率出水
  4. 计数器达到上限时,拒绝调用

当然,这只是大致思路,这时会有两个问题要注意

  1. 坏情况下的限流是额定限流速率的2倍
  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 地址

分享好友

分享这个小栈给你的朋友们,一起进步吧。

前端问题剖析
创建时间:2020-07-08 10:02:14
本小栈包含前端问题、云服务器、以及包含更多大厂面试问题汇总。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • llittle
    栈主

小栈成员

查看更多
  • 小雨滴
  • 浮夸流沙
  • long_32
  • LCR_
戳我,来吐槽~