06-微服务与中间件篇面试题
对应原始资料:
12-BAT/05-微服务篇、06-消息中间件篇、10-企业场景篇
一、消息队列
Q1:为什么用 MQ
异步、解耦、削峰。
Q2:MQ 引入的问题
- 系统可用性降低(MQ 挂了)。
- 系统复杂度提高(一致性、重复消费、顺序)。
- 一致性变弱(最终一致)。
Q3:如何保证消息不丢失
三个环节:
- 生产者:开启 confirm + return 回调。
- MQ:交换机、队列、消息持久化 + 集群镜像。
- 消费者:手动 ACK + 业务幂等。
Q4:如何保证消息顺序
- 同业务键路由到同一队列,单消费者顺序消费。
- 或 RocketMQ 顺序消息。
Q5:如何处理消息重复消费(幂等)
- 唯一键 + 数据库唯一约束。
- Redis 记录已处理消息 ID。
- 业务天然幂等(如覆盖更新)。
Q6:消息堆积怎么办
- 增加消费者 / 并发。
- 临时扩容。
- 死信队列兜底。
Q7:延迟队列实现
- RabbitMQ:TTL + 死信队列,或 delayed-message 插件。
- Redis:ZSet(score=过期时间)+ 定时扫描。
- RocketMQ:原生延迟等级。
Q8:Kafka / RocketMQ / RabbitMQ 选型
- 日志、大数据、超高吞吐:Kafka。
- 电商事务消息、强顺序:RocketMQ。
- 业务复杂、协议丰富、路由灵活:RabbitMQ。
二、注册中心
Q9:Nacos vs Eureka
| Nacos | Eureka | |
|---|---|---|
| 一致性 | AP/CP 可切换 | AP |
| 配置中心 | 集成 | 无 |
| 健康检查 | 心跳 + 主动探测 | 心跳 |
| 服务 | 阿里生态 | Netflix 停更 |
Q10:CAP 中 Nacos 选哪个
- 默认 AP(保证可用性)。
- 可切换 CP(一致性,用于配置)。
Q11:服务注册与发现流程
- 服务启动注册 → 客户端定时拉取/订阅服务列表 → 调用时本地负载均衡选实例。
Q12:Nacos 集群如何保证数据一致
- Distro 协议(AP,各节点分担)+ Raft(CP,持久化配置)。
三、网关
Q13:网关的作用
统一入口、路由、鉴权、限流、跨域、日志、协议转换。
Q14:Gateway 三个核心
Route(路由 = Predicate + Filter)、Predicate(断言)、Filter(过滤器)。
Q15:Gateway 限流
基于 Redis + Lua 的 RequestRateLimiter 令牌桶。
Q16:Gateway 与 Nginx 区别
- Nginx:C 写的,七层/四层,性能极高,偏静态/反向代理。
- Gateway:Java(WebFlux)写的,业务网关,可与 SpringCloud 无缝集成。
四、熔断限流
Q17:雪崩、穿透、击穿的区别
(缓存相关见 03 篇)。 微服务雪崩:服务调用链中下游故障导致上游阻塞,连锁失败。
Q18:如何防止雪崩
- 超时控制。
- 限流(Sentinel)。
- 熔断降级。
- 仓壁模式(线程隔离)。
Q19:Sentinel 与 Hystrix 区别
| Sentinel | Hystrix | |
|---|---|---|
| 隔离 | 信号量 | 线程池/信号量 |
| 熔断 | 慢调用比例、异常比例/数 | 异常比例 |
| 实时监控 | 控制台 | dashboard |
| 维护 | 阿里持续维护 | Netflix 停更 |
Q20:熔断状态机
CLOSED → OPEN → HALF_OPEN → CLOSED/OPEN。
五、分布式事务
Q21:常见方案
2PC、TCC、Seata AT、可靠消息、Saga。
Q22:Seata AT 流程
TM 开启全局事务(XID)→ 各 RM 执行本地事务并记 undo_log → TM 决议 → TC 通知 RM 提交(删 undo_log)/ 回滚(用 undo_log 反向补偿)。
Q23:本地消息表
业务表 + 消息表在同一本地事务,保证业务和发消息原子;后台扫描消息表发 MQ,消费方幂等。
Q24:RocketMQ 事务消息
- 半消息(不可见)→ 执行本地事务 → commit/rollback。
- 回查机制兜底。
六、Elasticsearch
Q25:ES 为什么快
- 倒排索引:根据词找文档。
- 分片 + 副本:并行查询。
- 全内存 + 磁盘分段(segment)合并。
Q26:ES 与 MySQL 同步
- 同步双写:业务代码同时写。
- 异步:MQ 通知。
- Canal 订阅 binlog 同步(推荐,业务无感)。
Q27:深分页
from + size 在 ES 中要每个分片取 from + size,深分页爆内存。 解决:search_after(基于排序值)、scroll(快照游标)。
Q28:match vs term
- match:分词后查(全文检索)。
- term:不分词查(精确匹配)。
七、企业场景题(高频)
Q29:秒杀系统设计
- 前端:按钮防抖、答题、CDN。
- 网关:限流、鉴权。
- 服务:Redis 预扣库存 + 异步 MQ 下单。
- 数据库:分库分表、乐观锁。
- 防超卖:Redis 原子扣减 + 唯一约束。
Q30:订单超时取消
- 定时任务扫描(简单、有延迟)。
- 延迟队列(推荐,TTL + DLX)。
- Redis ZSet 扫描。
Q31:分布式 ID
- UUID(无序、占空间)。
- 数据库自增(瓶颈)。
- 雪花算法 Snowflake(推荐):时间 + 机器 + 序列。
- 号段模式(美团 Leaf)。
Q32:系统性能优化思路
- 数据库:索引、缓存、读写分离、分库分表。
- 代码:异步、线程池、避免大对象。
- 中间件:Redis 缓存、MQ 削峰。
- 部署:CDN、负载均衡、横向扩容。
Q33:线上 CPU 飙高怎么排查
top找高 CPU 的 Java 进程。top -Hp pid找高 CPU 的线程。printf "%x\n" tid转 16 进制。jstack pid | grep tid看线程在做什么。- 或 arthas
thread -n 3直接看最忙线程。
Q34:接口慢怎么优化
- 数据库慢查询(explain + 加索引)。
- 缓存。
- 减少 RPC 次数(批量、缓存)。
- 异步化(MQ)。
- 代码逻辑(避免循环查 DB)。
高频考点速记
- MQ 三大作用 + 三个问题(不丢失、顺序、幂等)。
- Nacos:AP/CP 可切换,注册+配置一体。
- 网关:路由 + 断言 + 过滤。
- 防雪崩:超时 + 限流 + 熔断 + 仓壁。
- 分布式 ID:雪花。
- 排查工具:top → 线程 → jstack / arthas。