Skip to content

06-微服务与中间件篇面试题

对应原始资料:12-BAT/05-微服务篇06-消息中间件篇10-企业场景篇

一、消息队列

Q1:为什么用 MQ

异步、解耦、削峰

Q2:MQ 引入的问题

  • 系统可用性降低(MQ 挂了)。
  • 系统复杂度提高(一致性、重复消费、顺序)。
  • 一致性变弱(最终一致)。

Q3:如何保证消息不丢失

三个环节:

  1. 生产者:开启 confirm + return 回调。
  2. MQ:交换机、队列、消息持久化 + 集群镜像。
  3. 消费者:手动 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

NacosEureka
一致性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 区别

SentinelHystrix
隔离信号量线程池/信号量
熔断慢调用比例、异常比例/数异常比例
实时监控控制台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:秒杀系统设计

  1. 前端:按钮防抖、答题、CDN。
  2. 网关:限流、鉴权。
  3. 服务:Redis 预扣库存 + 异步 MQ 下单。
  4. 数据库:分库分表、乐观锁。
  5. 防超卖:Redis 原子扣减 + 唯一约束。

Q30:订单超时取消

  • 定时任务扫描(简单、有延迟)。
  • 延迟队列(推荐,TTL + DLX)。
  • Redis ZSet 扫描。

Q31:分布式 ID

  • UUID(无序、占空间)。
  • 数据库自增(瓶颈)。
  • 雪花算法 Snowflake(推荐):时间 + 机器 + 序列。
  • 号段模式(美团 Leaf)。

Q32:系统性能优化思路

  • 数据库:索引、缓存、读写分离、分库分表。
  • 代码:异步、线程池、避免大对象。
  • 中间件:Redis 缓存、MQ 削峰。
  • 部署:CDN、负载均衡、横向扩容。

Q33:线上 CPU 飙高怎么排查

  1. top 找高 CPU 的 Java 进程。
  2. top -Hp pid 找高 CPU 的线程。
  3. printf "%x\n" tid 转 16 进制。
  4. jstack pid | grep tid 看线程在做什么。
  5. 或 arthas thread -n 3 直接看最忙线程。

Q34:接口慢怎么优化

  • 数据库慢查询(explain + 加索引)。
  • 缓存。
  • 减少 RPC 次数(批量、缓存)。
  • 异步化(MQ)。
  • 代码逻辑(避免循环查 DB)。

高频考点速记

  • MQ 三大作用 + 三个问题(不丢失、顺序、幂等)。
  • Nacos:AP/CP 可切换,注册+配置一体。
  • 网关:路由 + 断言 + 过滤。
  • 防雪崩:超时 + 限流 + 熔断 + 仓壁。
  • 分布式 ID:雪花。
  • 排查工具:top → 线程 → jstack / arthas。