Skip to content

Latest commit

 

History

History
90 lines (64 loc) · 4.69 KB

10-distributed.md

File metadata and controls

90 lines (64 loc) · 4.69 KB

分布式与微服务

面试权重:高频(简历有「微服务」就要能讲取舍,而不是组件清单)
适合层级:中级及以上;校招了解 CAP/限流即可

Q1: 什么时候拆微服务?什么时候不要拆?

30 秒答法
拆的正当原因:独立发布、独立扩容、团队边界(康威定律)、故障隔离。
不要拆:同一团队、同一发布节奏、数据强一致且频繁联表、拆完还是同步链路打满。单体模块化 + 清晰边界,往往比 20 个服务更健康。面试官听的是你知不知道拆的成本(分布式事务、可观测、联调)。

Q2: CAP / BASE / 一致性模型

30 秒答法
分区发生时,系统在 C(线性一致) 和 A(可用性) 里必须偏一边。这是模型,不是「三个选两个」的口号。
CP 例子:etcd 选主期间可能不服务。AP 例子:DNS、多数缓存。
BASE:基本可用、软状态、最终一致。电商库存预扣、转账异步入账是这条路。
用户钱和库存扣减这类,要明确:哪一步允许最终一致,哪一步必须事务或约束。

追问

  • 线性一致、因果一致、会话一致差在哪?(给一个「读自己的写」例子)
  • 注册中心挂了已运行的服务还能调吗?(取决于客户端是否有本地缓存实例列表;Nacos/Eureka 设计不同)

Q3: 分布式事务

30 秒答法
优先避免:同一库事务、把强一致步骤收口到一个服务。
不得已:

方案 点 代价
本地消息表 可靠异步 要扫描与补偿
TCC Try/Confirm/Cancel 业务侵入,空回滚、悬挂
Seata AT 改 SQL 前后镜像,自动补偿 性能、脏写限制、对 ORM 不透明风险
Saga 长事务编排 + 补偿 补偿失败要人工

讲项目时只深挖你用过的那个,把失败回滚路径说完。

追问

  • TCC 空回滚?(Cancel 先于 Try 到达)
  • Seata AT 能锁住别人改同一行吗?(全局锁,和本地锁不是一回事)
  • 补偿为什么必须幂等?

Q4: 幂等、重试、超时

30 秒答法
网络失败时客户端不知道服务端有没有成功,所以超时 + 重试是默认,服务端必须幂等。
手段:唯一请求号、DB 唯一索引、状态机。超时要设在用户耐心和下游 SLA 之内,重试要有预算(最多 N 次、熔断)。对写接口默认「至少一次」思考。

Q5: 分布式 ID

30 秒答法
不要用 UUID 当聚簇主键(见 MySQL 章)。常见:数据库号段(美团 Leaf 一类)、Snowflake(机器时钟回拨是坑)、Redis incr(Redis 可用性绑死 ID)。
Snowflake:时间 + 机器 + 序列。时钟回拨:拒绝/等待/借用未来号。机器号怎么分配要讲(配置中心、手动、bit 位数)。

Q6: 限流、熔断、降级

30 秒答法
限流:保护自己(令牌桶/漏桶/滑动窗口;Sentinel/Gateway/Nginx)。
熔断:保护自己不被下游拖死(错误率/慢调用比例,半开探测)。
降级:牺牲非核心(兜底缓存、默认值、关闭推荐)。
热点参数限流是秒杀常考点。限流维度:用户、IP、接口、租户。

追问

  • 网关限流和 SDK 限流谁更准?(网关看入口;SDK 看实例。集群限流要共享计数,有误差)
  • 熔断误伤?(阈值、时间窗、对瞬时抖动;要有监控和手动关闭)

Q7: 注册发现、配置、网关(组件别只报名字)

30 秒答法
Nacos:注册 + 配置,AP/CP 可选,要讲客户端缓存与推空保护。
Gateway:鉴权、路由、限流、灰度。网关不要塞业务。
配置中心:敏感配置加密、灰度发布、回滚;忌频繁推导致全军刷新连接池。

组件原理、Feign 超时重试、Sentinel、Seata、一次请求怎么串起来,见 Spring Cloud。

追问

  • 服务发现 CAP?(Eureka AP;Consul/etcd 偏 CP;Nacos 可选)
  • 优雅上下线?(摘流量 → 等 in-flight → 停进程;K8s preStop + readiness)

Q8: 分布式锁(和 Redis 章呼应)

30 秒答法
锁只能互斥,不能替代幂等。Redis:效率。ZK/etcd:通知与会话,仍要处理超时。数据库:唯一约束往往是最诚实的「锁」。
锁的超时 vs 业务超时:必须假设锁会过期,临界区要可重入检查或版本号。

Q9: 可观测性(高级加分)

30 秒答法
指标(RED:Rate/Errors/Duration)、日志(traceId 贯穿)、链路(OpenTelemetry)。没有 traceId 的微服务等于没拆。SLO 先于工具:核心接口可用性和 P99 是什么,告警才有意义。