面试 · 对比辨析型
目标:考察对相近概念的精确区分能力和结构化对比思维。每题必须包含对比表。 答题框架:是什么 → 差异 → 替代方案 → 如何选(视题目类型选用适用步骤)。
1. SRE vs DevOps:核心区别是什么?#
| 维度 | DevOps | SRE |
|---|---|---|
| 核心主张 | 打破开发和运维壁垒 | 用软件工程做运维 |
| 关注点 | 文化 + 协作 + 工具链 | 可靠性量化 + 运维自动化 |
| 可靠性如何度量 | 无标准化方法 | SLI/SLO/Error Budget |
| 发布决策 | 主观判断或 CI/CD 门禁 | 基于 Error Budget 的数据驱动 |
| 运维工作量 | 团队共享,无明确比例 | 50% toil 上限硬约束 |
| 人才模型 | DevOps 工程师 | 软件工程师做 SRE |
| 可观测性 | 监控 + 告警 | 可观测性(未知的未知) |
| 关系 | 理念和文化层 | 具体工程实践层 |
差异:DevOps 回答"如何搭工具链",SRE 回答"如何用工具做决策"。DevOps 没有 SLO/Error Budget 这套量化框架,发布决策靠主观判断。
如何选:两者不互斥。最好的团队同时有 DevOps 文化(打破壁垒)和 SRE 实践(量化可靠性)。先做 DevOps 搭工具,再做 SRE 做决策。
2. SLI vs SLO vs SLA:三者的关系和区别#
| 维度 | SLI | SLO | SLA |
|---|---|---|---|
| 全称 | Service Level Indicator | Service Level Objective | Service Level Agreement |
| 本质 | 测量值 | 目标值 | 合同约束 |
| 例子 | "P99 延迟 = 230ms" | "月度 P99 ≤ 500ms" | "如月度可用性 < 99.9%,赔付 25%" |
| 谁定 | SRE/研发(技术指标) | SRE + 业务协商(内部目标) | 法务/商务(对外承诺) |
| 约束力 | 无 | 内部团队约束 | 法律约束 + 赔偿条款 |
| 变更频率 | 基本不变 | 季度回顾调整 | 合同周期内不变 |
| 是否所有服务都需要 | 是 | 是 | 否(只有对外服务) |
差异:SLI 是尺子(测量),SLO 是刻度(目标),SLA 是刻度加后果(违约赔付)。
如何选:关系链——SLI 测量 → 验证 SLO → SLA 比 SLO 更宽松。SLA 永远不能等于 SLO,中间必须有缓冲(如 SLO 99.95%,SLA 99.9%,缓冲 0.05%)。
3. 症状型告警 vs 原因型告警#
| 维度 | 症状型 | 原因型 |
|---|---|---|
| 定义 | 基于用户感受到的问题 | 基于系统内部组件状态 |
| 例子 | "Payment API 错误率 > 5%" | "Redis master pod 不可用" |
| 遗漏率 | 低——用户感受到的都能覆盖 | 高——想不到的根因不会配告警 |
| 噪声率 | 低——只在用户真受影响时响 | 高——组件故障但用户没事 |
| 可操作信息 | 明确(服务出问题了) | 模糊(需要进一步排查) |
| 用于 page | ✅ 是 | ❌ 否 |
| 维护成本 | 低(SLO 不变就不改) | 高(架构变就要改) |
差异:症状型度量"用户疼不疼",原因型度量"组件坏没坏"。前者直接对应用户体验,后者需要推断。
替代方案:原因型指标不直接 page,但用在 Dashboard、告警子条件、抑制条件、Ticket 级告警。
如何选:Google SRE 铁律——page 级告警必须是症状型。原因型放排障下钻用。
4. 熔断(Circuit Breaker)vs 限流(Rate Limiting)#
| 维度 | 熔断 | 限流 |
|---|---|---|
| 触发条件 | 下游错误率高/响应慢 | 请求量超阈值 |
| 目的 | 保护上游不被慢下游拖垮 | 保护下游不被过量请求打挂 |
| 粒度 | 按下游健康状态动态切换 | 按 QPS/并发数硬限制 |
| 状态 | CLOSED → OPEN → HALF-OPEN 三态 | 无状态,只做流量整形 |
| 方向 | 阻断"自己→下游"调用 | 阻断"上游→自己"请求 |
| 典型工具 | Hystrix/Sentinel/Resilience4j | Istio RateLimit/NGINX/令牌桶 |
差异:熔断是"下游生病了我避开",限流是"我自己只接这么多"。熔断是自适应的(根据错误率自动开关),限流是静态的(固定阈值)。
如何选:两者互补,必须组合使用。熔断防雪崩,限流防过载。一个完整的可靠性方案两者都需要。
5. 令牌桶(Token Bucket)vs 漏桶(Leaky Bucket)#
| 维度 | 令牌桶 | 漏桶 |
|---|---|---|
| 处理模型 | 预存令牌,请求来时取令牌 | 请求进队列,固定速率出队 |
| 是否允许突发 | ✅ 允许(桶里有令牌就能一次取完) | ❌ 不允许(处理速率固定) |
| 适用场景 | API 网关——允许突发但要限制平均速率 | 消息队列消费——需要平滑处理 |
| 关键参数 | Rate(令牌生成速率)+ Burst(桶容量) | Rate(出水速率)+ Queue Size(队列容量) |
| 用户体验 | 好(偶尔突发不被拒) | 一致(但突发会被拒) |
差异:令牌桶允许突发(桶里有令牌就能瞬间处理多个),漏桶强制平滑(不管请求多突发,处理速率恒定)。
如何选:API 网关用令牌桶(用户请求允许偶尔突发),消息队列消费用漏桶(必须匀速处理)。
6. 白盒监控 vs 黑盒监控#
| 维度 | 白盒监控 | 黑盒监控 |
|---|---|---|
| 数据来源 | 系统内部(Prometheus metrics/日志/trace) | 外部探测(HTTP probe/合成事务) |
| 能发现什么 | 已知的故障模式(提前想到的) | 未知的故障(没提前想到的) |
| 排障能力 | 能定位根因 | 只知道"有问题" |
| 覆盖时段 | 有真实流量时有效 | 7×24 持续有效 |
| 典型工具 | Prometheus/Grafana/Loki/Tempo | Blackbox Exporter/cuj-prober |
| 信号粒度 | 细(能下钻到 span) | 粗(只知道通/不通) |
差异:白盒是"系统自述健康状况",黑盒是"外部用户视角探测"。白盒能定位根因但只能回答"已知的未知",黑盒能发现"未知的未知"但不能定位根因。
如何选:SRE 要求两者互补。白盒做 SLO 和排障,黑盒做兜底和死机检测。半夜无流量时黑盒是唯一信号。
7. SLO 99.9% vs 99.99%:成本差异有多大?#
| 维度 | 99.9%(三个九) | 99.99%(四个九) |
|---|---|---|
| 月度允许不可用 | 43.2 分钟 | 4.32 分钟 |
| 年度允许不可用 | 8.76 小时 | 52.6 分钟 |
| 架构要求 | 单 AZ 多副本可能满足 | 必须多 AZ/多 Region |
| 工程投入 | 基础监控+告警+自动化 | 全链路冗余+自动故障转移+混沌验证 |
| 成本倍数 | 基准 1x | 通常 3-5x |
| 适用场景 | 一般业务服务 | 支付/交易核心 |
| on-call 强度 | 正常轮值 | 必须 7×24 高强度 |
差异:每增加一个九,允许的不可用时间减少 10 倍,但成本增加 3-5 倍。从 99.9% 到 99.999% 可能需要 10-20 倍成本。
如何选:根据用户期望和业务价值。内部工具 99% 够,一般业务 99.9%,核心交易 99.99%,电信级基础设施 99.999%。不要盲目追求高 SLO——多一个九的成本远非线性的。
8. 滚动更新 vs 蓝绿部署 vs 金丝雀发布#
| 维度 | 滚动更新 | 蓝绿部署 | 金丝雀发布 |
|---|---|---|---|
| 做法 | 逐个替换旧实例 | 新旧两套完整环境,切流切换 | 新版本先接小流量验证 |
| 回滚速度 | 慢(逐个回滚) | 快(切回旧环境) | 快(切回 100% 旧版) |
| 资源需求 | 无额外 | 双倍 | 少量额外 |
| 影响面控制 | 逐实例,不可控 | 瞬间 100% 切换 | 精确控制流量比例 |
| 风险等级 | 中 | 中 | 低 |
| 推荐作为 | 无状态简单服务 | 低流量服务 | 默认策略 |
| 数据库兼容 | 需向后兼容 | 需向后兼容 | 需向后兼容 |
差异:滚动更新是"渐进替换",蓝绿是"整体切换",金丝雀是"小流量先验证"。金丝雀风险最低因为有"试探"阶段。
如何选:金丝雀是默认策略。全量发布只应在内部工具等低风险场景使用。蓝绿适合需要瞬间切换的场景(如重大架构升级)。
9. HPA(水平扩缩)vs VPA(垂直扩缩)vs CA(集群扩缩)#
| 维度 | HPA | VPA | CA/Karpenter |
|---|---|---|---|
| 扩什么 | Pod 副本数 | Pod 资源请求 | Node 数量 |
| 方向 | 水平 | 垂直 | 水平 |
| 适用 | 无状态服务 | 有状态/难水平扩展 | Pod Pending 时触发 |
| 时间尺度 | 秒~分钟 | 分钟(需重启 Pod) | 分钟(需启动节点) |
| 风险 | 高(需要业务支持水平扩展) | 业务重启时风险 | 新节点冷启动延迟 |
| 和 HPA 兼容 | — | 不能同维度共用 | 配合使用 |
差异:HPA 加副本,VPA 加资源(CPU/内存),CA 加节点。HPA 是最常用的,VPA 适合"不知道该给多少资源"的服务,CA 是 HPA 的下游——HPA 触发后 Pod 没节点可调度时 CA 扩节点。
如何选:无状态服务用 HPA,有状态服务慎用 VPA(重启风险),所有集群配 CA/Karpenter 兜底。
10. Recording Rule vs Alerting Rule#
| 维度 | Recording Rule | Alerting Rule |
|---|---|---|
| 目的 | 预计算复杂表达式,加速查询 | 检测异常条件,触发告警 |
| 输出 | 新的时间序列 | 告警通知 |
| 使用方 | Dashboard / 其他规则 | Alertmanager |
| 命名规范 | level:metric:operation | 无固定规范,建议语义化 |
| 前置依赖 | 无 | 通常依赖 Recording Rules |
| interval | 30s(建议 ≤ 告警 for 的一半) | 和 for 配合 |
差异:Recording Rule 是"预计算",Alerting Rule 是"判定+触发"。前者产出新指标供查询,后者产出告警通知。
如何选:Recording Rule 是性能前提——没有它,燃烧率告警的长时间窗口计算会让 Prometheus 超时。所有 SLO 告警必须先建 Recording Rules。
11. Kubernetes liveness probe vs readiness probe vs startup probe#
| 维度 | Liveness | Readiness | Startup |
|---|---|---|---|
| 目的 | 检测是否需要重启 | 检测是否能接收流量 | 检测应用是否启动完成 |
| 失败后果 | Pod 被 kill 重建 | Pod 从 Service endpoints 移除 | 转为 liveness/readiness 判定 |
| 使用场景 | 死锁/死循环 | 预热未完成/依赖未就绪 | 慢启动应用 |
| 配置注意 | 不要和 readiness 设相同值 | 失败会停止接收流量但不会重启 | 只在启动阶段生效 |
| 误配置后果 | 频繁重启 | 流量丢失 | 启动失败 |
差异:Liveness 管"要不要重启",Readiness 管"要不要接流量",Startup 管"启动完成没"。三者各司其职,不能混用。
如何选:所有服务配 readiness(必须),核心服务配 liveness(防死锁),慢启动应用配 startup(如 Java)。
12. On-call primary vs secondary#
| 维度 | Primary | Secondary |
|---|---|---|
| 职责 | 接收所有告警,第一响应人 | 只在 primary 失联时顶上 |
| 是否每个告警都收到 | 是 | 否(仅 primary 5 分钟未 ack 时) |
| 资质要求 | 能独立处理常见告警 | 可以更低资历 |
| 轮值安排 | 与 secondary 错开周期 | 负担比 primary 轻 |
| 升级触发 | — | primary 5 分钟未 ack |
差异:Primary 是"第一响应人",Secondary 是"备份"。Secondary 不是"第二个 primary",只在 primary 失联时才被叫醒。
如何选:关键设计——Secondary 不能被每个告警打扰,否则浪费两人时间。3 层升级链足够(primary → secondary → team lead),再多让 primary 产生依赖心理。
13. 发布中的 Error Budget 检查 vs CI/CD 质量门禁#
| 维度 | Error Budget 检查 | CI/CD 门禁 |
|---|---|---|
| 检查内容 | 服务近期可靠性是否达标 | 代码是否通过测试/静态分析 |
| 决策依据 | "系统能不能接受这次发布的风险" | "代码本身有没有问题" |
| 典型条件 | Budget > 50% 正常发;<10% 冻结 | 单元测试通过 + lint 通过 |
| 谁维护 | SRE | DevOps/Platform |
| 关注时点 | 发布前 | 代码合并前 |
| 性质 | 风险管理 | 质量管理 |
差异:CI/CD 门禁管"代码对不对",Error Budget 管"系统能不能承受这次发布的风险"。前者是代码质量,后者是系统风险承受能力。
如何选:两者互补,缺一不可。代码再好,Budget 耗尽时也不能发;Budget 再多,代码没过 CI 也不能发。
14. 嵌入式 SRE vs 平台 SRE#
| 维度 | 嵌入式 SRE | 平台 SRE |
|---|---|---|
| 工作方式 | 嵌入到研发团队 | 建设共享平台 |
| 优点 | 深入业务,沟通成本低 | 产出可复用,标准统一 |
| 缺点 | 资源分散,难以标准化 | 离业务远,可能变成"没人用的架子" |
| 适用 | 大型独立业务线 | 多条业务线的中大型组织 |
| SRE 资源效率 | 低(一对一) | 高(一对多) |
| 知识传递 | 强(和研发天天在一起) | 弱(通过平台文档) |
差异:嵌入式 SRE 像顾问,深入业务但资源分散;平台 SRE 像工具商,产出可复用但离业务远。
如何选:混合模型是中大型公司的常见选择——平台组建基础设施,嵌入组配核心业务。小团队用平台 SRE(效率高)。
15. GameDay 演练 vs 常态化故障注入#
| 维度 | GameDay | 常态化注入 |
|---|---|---|
| 频率 | 手动安排,一周到一月一次 | 自动执行,每天/每小时 |
| 参与 | 团队集中参与 | 无人值守(自动执行+报告) |
| 目的 | 团队学习、暴露流程问题 | 持续验证系统可恢复性 |
| 复杂度 | 可做复合故障场景 | 简单单一故障 |
| 需要什么 | 假设文档+安全护栏+复盘 | Chaos Mesh Schedule + 告警回滚 |
| 产出 | 深度复盘 + Action Items | 简报 + 异常告警 |
差异:GameDay 是"集中深度演练",常态化是"日常持续验证"。前者解决团队学习和文化问题,后者解决系统韧性持续维持问题。
如何选:两种形式都要做。GameDay 季度做一次深度演练,常态化每天自动注入。互补关系,不是替代。
16. 监控(Monitoring)vs 可观测性(Observability)#
| 维度 | 监控 | 可观测性 |
|---|---|---|
| 回答什么问题 | 已知的未知(known unknowns) | 未知的未知(unknown unknowns) |
| 工作方式 | 预设仪表盘+阈值告警 | 从输出反推内部状态 |
| 数据来源 | 预先定义的指标 | 任意维度查询 |
| 故障发现 | 只能发现预想过的故障 | 能发现没预想过的故障 |
| 排障能力 | 有限(只看预设面板) | 强(任意下钻) |
| 典型工具 | Nagios/Zabbix 传统监控 | Prometheus+Loki+Tempo 三支柱 |
差异:监控只能回答你提前想到的问题("CPU 高了吗"),可观测性要求系统回答你没提前想到的问题("为什么这个用户下单失败")。
如何选:可观测性是监控的超集。目标是可观测性——三支柱(指标/日志/链路)+ 关联键(trace_id)+ 下钻闭环。
17. 自动回滚 vs 人工回滚#
| 维度 | 自动回滚 | 人工回滚 |
|---|---|---|
| 响应速度 | 秒级 | 分钟级(人看到告警→判断→执行) |
| 误判风险 | 较高(可能非发布原因触发) | 低(有人判断) |
| 疲劳成本 | 零 | 每次都需要人介入 |
| 凌晨响应 | 不受影响 | 值班人可能没醒 |
| 复杂度 | 高(需要自动化) | 低(人工执行) |
| 适用条件 | SLO burn rate > 14.4x | 其他条件 |
差异:自动回滚快但可能误判,人工回滚准但慢。14.4x burn rate 时每分钟都在烧预算,等不起人工判断。
如何选:SLO burn rate > 14.4x 自动回滚(没时间等人),其他条件人工确认后回滚。
18. 错误率 SLO vs 延迟 SLO#
| 维度 | 错误率 SLO | 延迟 SLO |
|---|---|---|
| 衡量什么 | 请求成功/失败 | 请求响应时间 |
| 典型目标 | 月度错误率 < 0.1% | P99 < 500ms |
| 用户感知 | "服务挂了" | "服务慢了" |
| 实现复杂度 | 简单(成功/失败明确) | 复杂(需 histogram) |
| 常见陷阱 | 4xx 处理 | 用平均值 |
| 是否必须 | 是 | 是 |
差异:错误率衡量"对不对",延迟衡量"快不快"。用户两个都关心——又对又快才是好体验。
如何选:两者必须独立管理,独立计算 Error Budget。只有错误率 SLO 没有 latency SLO,会出现"成功率 100% 但每个请求要 10 秒"的假健康状态。
19. Toil vs 工程(Engineering)#
| 维度 | Toil | 工程 |
|---|---|---|
| 性质 | 手动、重复、可自动化、无持久价值、操作型 | 创造性、有持久价值 |
| 例子 | 手工重启 Pod、手工清理磁盘 | 写自动化工具、建监控平台 |
| 与规模关系 | 正比(规模越大 toil 越多) | 反比(工程投入后 toil 减少) |
| 对 SRE 价值 | 消耗时间 | 创造时间 |
| 占比约束 | ≤ 50% | ≥ 50% |
差异:Toil 是"做完之后系统状态没改善",工程是"做完之后系统结构性变好"。Toil 是规模陷阱(规模翻倍 toil 翻倍),工程是规模解耦(一次投入永久受益)。
如何选:50% toil 上限是硬约束。Toil > 50% 时必须启动治理——削减告警、自动化高频操作、推回给研发。
20. Postmortem 的 Fix vs Prevent vs Detect vs Mitigate vs Process#
| 类型 | 作用 | 例子 | 缺失的后果 |
|---|---|---|---|
| Fix | 修根因 | 加索引 | 同样故障立即重演 |
| Prevent | 防再发 | 加 SQL lint | 同类故障在其他地方出现 |
| Detect | 早发现 | staging 压测 | 下次故障检测滞后 |
| Mitigate | 减影响 | 告警窗口缩短 | 下次故障影响更大 |
| Process | 流程改进 | 更新 Runbook | 流程缺陷继续存在 |
差异:Fix 修"这次",Prevent 防"一类",Detect 早发现,Mitigate 减影响,Process 改流程。五类各有不可替代的作用。
如何选:每个 Postmortem 的 Action Items 必须五类齐全,至少各一条。只有 Fix 没有 Prevent,同类问题会在其他服务重演。
21. 紧急止损 vs 根因排查#
| 维度 | 紧急止损 | 根因排查 |
|---|---|---|
| 时序 | 事故第一时间 | 系统恢复后 |
| 目标 | 让业务恢复 | 找到为什么出问题 |
| 耗时 | 分钟级 | 小时~天级 |
| 风险 | 低(已知操作如回滚) | 中(排查可能触发新问题) |
| 优先级 | 高(先做) | 低(后做) |
差异:止损是"先让业务恢复",根因是"找为什么出问题"。止损有明确路径(回滚、切流、重启),根因需要调查。
如何选:先止损后找根因是事故响应的核心原则。先找根因的风险——花 1 小时定位根因,业务已经挂了 1 小时。止损后压力消失,有更冷静的环境查根因。
22. Pull 监控 vs Push 监控#
| 维度 | Pull(Prometheus 模型) | Push(OTLP/StatsD 模型) |
|---|---|---|
| 谁主动 | 监控系统周期性去抓 target | 被监控方主动推给收集器 |
| 优点 | 监控端掌控频率;抓不到=target 死了 | 短命任务/Serverless 友好 |
| 缺点 | 要做服务发现 | 收集端要扛峰值 |
| 存活检测 | 天然有(抓不到就告警) | 需要额外心跳 |
| 适用 | 长驻服务 | 短命任务/批处理/Serverless |
差异:Pull 是"监控系统主动抓",Push 是"被监控方主动推"。Pull 模型"抓不到就是宕机"这个免费的存活检测是最被低估的优点。
如何选:长驻服务的指标用 Pull(Prometheus),日志/链路天然是 Push(事件流没法 pull),短命任务用 Push Gateway 兜底。
答题技巧:对比辨析题的关键是先画表再补充说明。面试官看对比表 30 秒就能判断你的理解深度,后面的文字说明(差异 + 替代方案 + 如何选)是加分项。框架:是什么 → 差异 → 替代方案 → 如何选。