一面
1.项目中的难点
- orgagent的线程隔离
- 机构的流程配置化
2.MySQL
MySQL的索引结构?
B+树
B树和B+树的区别
B树的每个结点都存储了key和data,B+树的data存储在叶子节点上
节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少
树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录
由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好
描述下可重复读和不可能重复读
同一个事务中发起多次查询,每次读取到的数据相
同的,无论其他事务有没有对数据进行修改,当不影响当前事务的读取
描述下MVCC
MVCC是多版本并发控制,是为了解决InnoDB中的不可重复读现象
通过把undo log,将所有事务的修改串联成一个版本链,当读取数据时根据read view来判断哪个版本的数据是自己可以读取的
3.GC
项目中使用的垃圾回收器
CMS + ParNew
CMS的四个阶段
- 初始标记(STW)
- 并发标记
- 重新标记(STW)
- 并发清除
4.Redis
- redis在项目中的应用
- 分布式锁是如何实现的
- setnx 为什么要设置超时时间
5.RPC
RPC中都有哪些组件
基础功能
通信协议:协议头、协议体、可变协议
序列化:JDK、JSON、Hession、Protobuf
网络IO模型:阻塞IO、IO多路复用
动态代理:JDK动态代理、CGLIB
服务相关
服务发现:服务注册、服务发现
健康检查:检查服务状态、心跳机制、客户端请求成功率
路由策略:做灰度、全链路灰度等
服务分组:服务之间进行隔离,彼此不影响
负载均衡:随机权重、轮询权重
异常重试:客户端根据指定的异常进行充实
优雅起停:停止由外到内,启动由内到外
熔断限流:服务端限流、降级,客户端熔断
高级优化
异步RPC:压榨服务的吞吐量
链路追踪:全局链路跟踪
动态分组:
泛化调用:
6.TCP
滑动窗口
7.算法
1 | [3,3,4,4,5,5,7,1,1,2,2] |
二面
1.API机构线程隔离
- 机构间Http互相影响
2.API机构差异配置
- 流程配置
- 组件配置
3.MySQL
- redo log
- bin log
4.Redis
- 热key的发现与处理
- 大量key过期导致redis服务卡顿
5.JMM
- 并发问题的产生原因
6.Java
- 线程池创建核心线程的流程
- 项目中线程池的配置,拒绝策略使用什么
7.JVM
- 用的什么收集器
- 卡表
- JVM层级的监控有没有(老年代比例、GC次数等参数监控)
8.限流算法
- 漏斗
- 令牌桶(实现简单的令牌桶)
三面
1.实现一个服务治理框架,初期的选型工作都要做哪些?
2.使用的框架出现了难题,找不到好的解决方案怎么办?
3.Kakfa
- 如何做到高吞吐量
- 顺序写
- SSD还有必要顺序写吗
- 零拷贝
- mmap和sendfile
- 批量发送
- 客户端如何做到批量发送
- Reactor
- 顺序写
- 如何做到低延迟
4.Redis
- key过期策略
- 25%是静态参数,还是动态调整的
- redis主从切换
- 主从切换的过程
- 客观下线和主观下线的区别
5.如何保证服务稳定性,四九9,一个5,SLA
- 资源监控
- 服务监控
- 业务监控
6.十个人十把椅子
有1-10号椅子,1-10号人,第N个人坐第N把椅子的概率是多少