面试知识库
困难

服务治理SLO与拆分复盘#

一句话答案#

SLO 是服务治理的度量标尺:SLI 定义指标(延迟/可用性/错误率)、SLO 设定目标(P99<200ms/可用性99.95%)、错误预算=1-SLO 用来平衡迭代速度与稳定性;服务拆分的核心判断是业务边界而非代码量,拆分后必须验证调用链复杂度和故障爆炸半径是否可控。

核心要点

一、SLI/SLO/SLA 三层体系

概念定义示例负责方
SLI (指标)衡量服务质量的具体指标P99延迟、成功率、吞吐量研发定义
SLO (目标)SLI 的目标值P99<200ms、可用性≥99.95%研发+产品协商
SLA (协议)对外承诺+违约赔偿可用性<99.9% 赔偿10%费用商务签约

核心 SLI 选择:

服务类型关键 SLISLO 示例
API 服务P99延迟、成功率P99<200ms、成功率≥99.95%
数据处理吞吐量、完成时间日处理>1000万条、延迟<1h
存储服务可用性、持久性可用性99.99%、持久性11个9

二、错误预算机制

错误预算 = 1 - SLO

示例:SLO = 99.95% 可用性(月度)
  → 错误预算 = 0.05% = 30天 × 24h × 60min × 0.05% ≈ 21.6 分钟/月

含义:每月允许 21.6 分钟的不可用时间

预算使用规则:
  ├─ 预算充足(>50%) → 正常迭代发布
  ├─ 预算紧张(20-50%) → 减少变更频率、加强灰度
  ├─ 预算耗尽(<20%) → 冻结非关键变更、全力修复稳定性
  └─ 预算透支 → 停止所有非安全发布,复盘根因
plaintext

三、SLO 驱动的告警设计

多窗口多燃烧率告警(Google SRE 推荐):

快速告警(5分钟内发现):
  IF 错误率 > 14.4 × (1-SLO) 持续 2分钟
  → Page 值班(1小时消耗掉2%预算的速率)

慢速告警(30分钟内发现):
  IF 错误率 > 6 × (1-SLO) 持续 15分钟
  → Page 值班

趋势告警(6小时内发现):
  IF 错误率 > 1 × (1-SLO) 持续 1小时
  → Ticket(不紧急但需处理)
plaintext

四、服务拆分判断框架

什么时候该拆:

信号说明
发布耦合A 功能改动导致 B 功能需要一起发布
团队冲突不同团队频繁改同一代码库
扩缩容不同订单服务需要 10 实例,商品服务只需 2 个
故障爆炸半径大一个模块 OOM 导致整个服务不可用

什么时候不该拆:

信号说明
团队太小3-5 人维护不了多个服务的基础设施
频繁跨服务事务拆后大量分布式事务 = 复杂度暴增
数据强耦合拆后需要大量 JOIN → 改为 RPC 更慢
纯粹为了微服务没有业务驱动的拆分是过度设计

拆分验证 checklist:

□ 调用链是否增加(Trace 跨度数)→ 跨度增加 >3 需警惕
□ 故障爆炸半径是否缩小 → 拆后单服务故障不影响其他
□ 延迟是否劣化 → 新增 RPC 调用的 P99 增量
□ 数据一致性方案是否可行 → 分布式事务/最终一致
□ 运维负担是否可接受 → CI/CD/监控/日志 是否就绪
plaintext

五、API 演进治理

策略适用实现
URL 版本号REST API/api/v1/users/api/v2/users
Header 版本灵活控制Accept: application/vnd.api+json;version=2
向后兼容优先选择只加字段不删/改字段
双版本并行过渡期新旧版本同时运行,旧版本设废弃期
面试回答(2分钟版)

服务治理我用 SLO 作为度量标尺。首先选择关键 SLI,API 服务看 P99 延迟和成功率,然后设定 SLO 比如 P99 小于 200ms、成功率 99.95%。错误预算等于 1 减 SLO,99.95% 对应每月约 21 分钟不可用。预算充足时正常迭代,预算紧张时减少发布频率,预算耗尽就冻结非关键变更。告警也基于 SLO:用多窗口多燃烧率,快速告警 2 分钟内发现严重问题,趋势告警 1 小时发现缓慢恶化。服务拆分的判断框架是看四个信号:发布耦合、团队冲突、扩缩容差异、故障爆炸半径。但也有不该拆的情况:团队太小、频繁跨服务事务、数据强耦合。拆完后必须验证调用链复杂度和延迟劣化是否可接受。API 演进优先选向后兼容只加字段,必须不兼容时走 URL 版本号加废弃过渡期。

追问与易错

追问方向:

  • “SLO 怎么和产品方协商?”→ 先统计现有 SLI 基线,再根据用户体验要求设定;不是越高越好
  • “错误预算透支了怎么办?”→ 停发布+事后复盘+改进 SLO 或基础设施
  • 拆分后数据怎么迁移?(双写过渡期→切读→切写→清理旧表)
  • “跨服务调用超时怎么设?”→ 下游 P99 + buffer;总超时 < 上游超时

易错点:

  • ❌ “SLO 越高越好”——99.999% 成本是 99.9% 的 100 倍,要权衡
  • ❌ “拆微服务就是好架构”——没有业务驱动的拆分是反模式
  • ❌ “错误预算是用来浪费的”——是用来平衡迭代速度和稳定性的工具
  • ✅ 核心思路:SLO 驱动告警和发布决策,拆分基于业务边界而非技术偏好