01. 后端开发工程师
Backend Interview | 服务端架构面试题集锦
Backend Interview 是 Awesome Interviews 系列的组成,涵盖了笔者在日常积累中总结而来的可成为面试题的知识要点与场景案例。
本文所提及的问题皆可在下列文档矩阵中寻找到解答,请自行索引。
全局唯一有序
后端清单全局唯一有序
4、微服务的高可用怎么保证的?
5、常用的负载均衡,该怎么用,你能说下吗?
6、网关能够为后端服务带来哪些好处?
7、
8、
9、反射的机制
10、
11、
12、对象比较是否相同
13、
14、
15、
16、
17、如果存取相同的数据,
18、
19、常见
20、
21、
22、
23、
24、
25、
26、
27、如何保证线程安全问题?
28、synchronized、lock
29、
30、
31、
32、
33、公平锁和非公平锁
34、
35、读写锁设计主要解决什么问题?
36、你项目除了写
37、
38、
39、不可重复读会出现在什么场景?
40、
41、前端浏览器地址的一个
42、
43、
44、你们开发用的
45、代码版本管理你们用的是啥?
编程语言
Java
并发编程
-
Java 中的线程与Linux 操作系统中的进程或者线程概念是如何映射的? -
对于原子操作而言,
synchronized, cas, AtomicInterger, LongAdder 哪种方式性能较好,为什么? -
synchronized 是如何保证JMM 中的原子性、可见性与有序性的? -
如下单例模式的代码可能存在什么问题?请从内存模型的角度思考。
public class Singleton {
static Singleton instance;
static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) instance = new Singleton();
}
}
return instance;
}
}
JVM
- 有时候在模拟有大量超时情况的
JMeter 压力测试中,前数分钟响应经常会超时,但是后面会突然降到毫秒级别,这可能是因为什么?
Go
Goroutine 机制简述,其与JVM 线程的区别?为什么Go 的线程调度使用了G-P-M 模型而不是G-M 模型?Go 中应该如何创建新的对象,make 关键字常用于哪些场景下。
编程基础
Java
关于此部分的详细索引可以参考笔者的
数据结构与算法
关于数据结构与算法系列详细的文章列表可以参考笔者的数据结构与算法系列综述
笔者也是本次校招开始之后短短月余的时间才开始刷题,如果只是为了应付校招多学点套路也能说得过去,但是刷题本身的热趣确实挺有意思。关注笔者的博客或者
一条
服务端基础
微服务与云原生
- 有状态服务与无状态服务的区别在哪里?如何设计幂等性服务?
Spring
-
你所在的公司
/ 负责的项目组,是否使用过微服务;如果使用过,那么完整的研发部署流程会包含哪些关键的步骤、组件? -
Spring Boot 默认的Worker 线程池大小是多少? -
是否使用过
MyBatis 提供的缓存机制,是否开启过二级缓存,如果开启过,那么缓存返回的对象是否是线程安全的? -
目前在项目中使用的数据库连接池是什么?如果是
HikariCP ,那么其为什么性能相较于其他数据库会比较好? -
Spring 中的定时器,在单线程模型下,假如定时任务是5 秒执行一次, 但是第一个任务就执行了8 秒, 第二个会怎么样呢?
DevOps
Test
- 在服务测试中如何模拟百万级并发请求?
高可用架构
-
如何设计多租户隔离系统?可以从系统隔离、服务隔离、异地多活等多领域阐述?
-
常见的流量控制、熔断降级的手段有哪些?
-
Sentinel 是否会对服务带来额外负载? -
在发生故障时,我们应该优先恢复局部故障还是全局故障?
基础架构
Linux 与操作系统
分布式系统
- 如何理解
CAP 理论?常用的保障CA/CP/AP 的策略有哪些?如何理解BASE 理论?
分布式计算
并发编程
IO 多路复用属于同步阻塞型IO 模型还是异步非阻塞IO 模型?
数据库
MySQL 与关系型数据库
-
MySQL 中的主键应该选择怎样的策略去创建?常见的分布式ID 生成的策略有哪些?为什么不建议使用订单号作为主键? -
简述
select city,name,age from person where city(存在索引)='武汉' order by name limit 100;
的底层执行逻辑?为什么数据库索引中常使用合并排序算法?如果针对city-name
添加了联合索引,那么执行逻辑上会有何区别?为什么要在需要排序的字段上加索引? -
是否应该尽可能地添加列索引?应该以什么原则选择需要索引的列?像性别这样的列是否应该添加索引?
InnoDB 事务提交后在底层都干了些什么?如果发生写失效( 页16KB 数据, 只写了8Kb), 可以通过重做日志进行恢复, 为什么还需要double_write?
-
简述
update person set age = 30 where id = 1;
在数据库引擎中的执行流程。 -
MySQL 并发控制策略中的锁机制与MVCC 分别会被用于哪些场景下?for update 的记录不存在会导致锁住全表?
-
如果某条
SQL 执行较慢,能否分析下其原因? -
Redo Log 和Binlog 有什么区别?
缓存
- 如何保证缓存与数据库的双写一致性?譬如如何保证
MySQL 与Redis 中地数据一致性? - 如何设计一个大规模高并发的数据缓存系统?
数据库拆分与中间件
-
如何设计一个分布式用户登录系统,能够根据用户
ID 将请求分发到不同的服务器?如果某台服务器出现了故障,应该如何进行重划分? -
在
MySQL 数据库中,一般单表数据量超过多少后会建议分库分表?为什么会有这样的考量? -
在分库分表的情况下,一般如何设计跨库的分页查询;如果进行分页查询,应该使用
limit 100,10 ORDER BY id
还是where id > ? limit 10
的形式?
分布式计算
并发编程
- 什么是协程?协程相对于线程的优势是什么?
Go 中协程模型是如何实现的?在什么情况下应该优先选择协程?在什么情况下应该优先选择多线程?
消息中间件MOM
-
是否了解过常见的消息中间件?能否简述下不同的业务场景下应该如何去选择合适的消息中间件?
-
常见的消息中间件采取怎样的持久化策略?
-
常见的消息中间件是如何保障其高可用特性的?
容器与虚拟化
Docker
Docker 中如何配置容器访问主机?可以设置网络为host 模式,或者设置主机的DNS 解析规则。
典型业务系统
BPM 流程引擎
IM
- 如何设计
Feed 流系统,针对十万、千万、十亿等不同的用户体量时其设计有什么差异?
Links
-
https://github.com/digoal/blog/blob/master/201806/20180623_01.md
-
Java 进阶面试问题列表翻译自Java developer interview questions: The hard part,从属于笔者的Java 入门与工程实践系列。最近公司打算招几个Java 开发人员,正巧在Reddit 上看到了该文,顺手翻译了一波。只是单纯的问题列表,可能较水,慎进。
面向对象编程的基本理念与核心设计思想
-
解释下多态性
(polymorphism) ,封装性(encapsulation) ,内聚(cohesion) 以及耦合(coupling) 。 -
继承
(Inheritance) 与聚合(Aggregation) 的区别在哪里。 -
你是如何理解干净的代码
(Clean Code) 与技术负载(Technical Debt) 的。 -
描述下常用的重构技巧。
-
阐述下 SOLID 原则。
-
其他的譬如
KISS,DRY,YAGNI 等原则又是什么含义。 -
什么是设计模式
(Design Patterns) ?你知道哪些设计模式? -
你有了解过存在哪些反模式
(Anti-Patterns) 吗? -
你会如何设计登陆舰
/ 数学表达式计算程序/ 一条龙? -
你知道哪些基本的排序算法,它们的计算复杂度如何?在给定数据的情况下你会倾向于使用哪种算法呢?
-
尝试编写如下代码:
- 计算指定数字的阶乘 -
开发 Fizz Buzz 小游戏
- 倒转句子中的单词- 回文字符串检测 -
枚举给定字符串的所有排列组合
Java 核心概念
equals 与hashCode 的异同点在哪里?Java 的集合中又是如何使用它们的。- 描述下
Java 中集合(Collections) ,接口(Interfaces) ,实现(Implementations) 的概念。LinkedList 与ArrayList 的区别是什么? - 基础类型
(Primitives) 与封装类型(Wrappers) 的区别在哪里? final 与static 关键字可以用于哪里?它们的作用是什么?- 阐述下
Java 中的访问描述符(Access Modifiers) 。 - 描述下
String,StringBuilder 以及StringBuffer 区别。 - 接口
(Interface) 与抽象类(Abstract Class) 的区别在哪里。 - 覆盖
(Overriding) 与重载(OverLoading) 的区别在哪里。 - 异常分为哪几种类型?以及所谓的
handle or declare
原则应该如何理解? - 简述垃圾回收器的工作原理。
- 你是如何处理内存泄露或者栈溢出问题的?
- 如何构建不可变的类结构?关键点在哪里?
- 什么是
JIT 编译? Java 8 / Java 7 为我们提供了什么新功能?即将到来的Java 9 又带来了怎样的新功能?
Hibernate / 数据库
- 请解释下
ORM 。 Hibernate 与JPA 区别在哪?Hibernate 最新版提供了哪些特性?- 什么是懒加载
(Lazy Loading) ? - 什么是
N+1 难题? - 介绍一些熟悉的
Hibernate 注释。 - 简介下
Hibernate Session 与SessionFactory 。 Entity Beans 的状态有哪些。Hibernate 中的缓存分为几层。Hibernate 中事务的支持分为几级?- 什么是乐观锁
(Optimistic Locking) ? - 简述下
ACID 原则。 - 简述下数据库正则化
(Normalizations) 。 - 请介绍下你日常工作中优化慢查询
(Slow Query) 的策略。
Spring
- 新版的
Spring 中有哪些新特性? - 介绍下
Spring 的优势与缺陷。 - 什么是控制反转
(Inversion of Control) 与依赖注入(Dependency Injection) ? - 你用过哪些
Spring 的模块? Spring 中是如何使用依赖注入的?Spring 中提供了几种自动注入的机制?- 介绍下
Spring MVC 。 Spring 中Scopes 有哪些?Spring 中Bean 的生命周期包含哪些步骤?Spring Bean 与EJB Bean 的区别在哪里?
其他主题
- 介绍下切面编程
(Aspect Oriented Programming) 。 - 概述下
GET 与POST 的区别。 - Web Server、
Web Container 与Application Server 的区别是什么? - 简要介绍下从浏览器输入
URL 开始到获取到请求界面之后Java Web 应用中发生了什么。 - 什么是
N 层架构? - 微服务
(MicroServices) 与巨石型应用(Monolithic Applications) 之间的区别在哪里? - 你知道哪些商业级设计模式?
- 你是如何测试一个应用的?知道哪些测试框架?
- 你是如何测试单个方法的?
- 在你的职业生涯中,算得上最困难的技术挑战是什么?
- 什么是领域驱动开发
(Domain Driven Development) ? - 介绍下一些你最爱的
IDE 的常用插件。 - 除了
IDE 之外,你的日常工作中还会用到哪些工具? - 你使用什么版本管理工具?
- 分支
(Branch) 与标签(Tag) 之间的区别在哪里? - 你常用的持续集成
(Continuous Integration) 、静态代码分析(Static Code Analysis) 工具有哪些?
综合系统设计能力
-
秒杀系统设计。
-
短链接系统设计。
-
点赞系统设计。
Links
- https://zhuanlan.zhihu.com/p/70410011
- https://zhuanlan.zhihu.com/p/78310685 面试碰到分布式技术面试题该怎么解答?