题干与适用场景
请设计一个为多服务计算 SLO、错误预算和 burn rate,并触发可靠性门禁与告警的服务。你如何处理数据延迟、窗口选择、静默、回填和策略例外?
这道题适合 SRE、平台、后端和系统设计岗位。Google SRE 将错误预算作为平衡可靠性与发布速度的协作机制;burn rate 告警关注预算被消耗的速度。重点是把定义、计算、告警、决策和审计连成可验证的系统。
面试官考察点
- 是否区分 SLI 事件、SLO 目标、合规期、错误预算和 burn rate。
- 是否能解释快燃烧与慢燃烧窗口的互补关系及噪声权衡。
- 是否设计事件去重、迟到数据、重复样本、回填和版本化。
- 是否把告警与发布门禁、值班响应、静默和人工例外分开。
- 是否为多租户隔离、查询成本、历史可追溯和权限设计边界。
- 是否以数据质量指标和回放验证策略,而非只展示一张仪表板。
30 秒回答框架
“我会把服务拆成 SLO 规范、事件摄取、窗口聚合、预算计算、策略评估和通知审计。每个 SLO 固定成功事件、总事件、目标、合规期与版本;burn rate 是当前错误率相对于允许错误率的倍数。用快窗口捕捉突发、慢窗口确认持续问题,告警带上证据和数据新鲜度。迟到或回填数据只产生版本化重算,不静默改写已经审计的发布决定。”
分步骤深入解答
第一步:定义 SLI 与事件契约
SLO 规范应声明服务、指标类型、成功事件、总事件、目标比例、合规期、聚合维度和时区。计数器必须有稳定的去重键和采集时间;错误分类要避免把客户端取消、依赖失败和平台故障混在一个 SLI 中。规范发布后版本化,历史计算引用当时版本。
第二步:计算预算与燃烧率
若目标为 99.9%,合规期内允许的错误比例为 0.1%。当前窗口错误率除以允许错误率得到 burn rate;数值为 1 表示按预算速度消耗,数值大于 1 表示更快。存储原始计数与聚合结果,保留分子、分母和时间边界,便于复算而不是只存百分比。
第三步:组合快慢窗口
快窗口能迅速发现发布造成的尖峰,慢窗口能确认影响持续存在。策略记录两个窗口的长度、burn-rate 阈值、最小事件量和触发次数;只有数据新鲜度和分母规模满足条件才触发。不同服务可以有不同策略,但默认模板应明确目的,避免把所有告警压成一个阈值。
第四步:处理迟到、重复与回填
摄取层按事件 ID 或时间桶幂等,聚合任务保存水位和校正版本。迟到数据进入允许的延迟范围并触发重算;超出范围则标记数据不完整。回填不能无声改变已发出的通知或门禁,系统应记录旧值、新值、操作者、原因和受影响的决策 ID。
第五步:连接告警、门禁与人工例外
告警服务负责通知和升级,发布控制器负责暂停或要求批准,策略服务只输出带证据的状态。例外必须有范围、过期时间、审批人和理由;静默只抑制通知,不得停止预算计算。每次门禁决定携带 SLO 版本、窗口、计数、数据新鲜度和规则版本,便于审计。
第六步:保证规模与可观测性
按服务、区域和租户分片聚合,限制高基数维度并缓存重复查询。监控摄取延迟、丢失率、重复率、聚合滞后、计算耗时、通知成功率和策略评估错误。用历史回放验证快慢窗口,用故障注入验证从事件到告警和门禁的端到端延迟;数据不完整时显示不确定,而不是显示健康。
取舍、边界与信息增益
错误预算服务的核心增益是把可靠性目标转化为可审计的工程决策。燃烧率越敏感,噪声和告警负担越高;窗口越长,响应越慢。系统应把计算事实、通知动作和发布决策分离,并允许回填重算但保留历史版本。它不替团队决定优先级,只提供共同证据。
高质量示范回答
“我会先建立版本化 SLO 规范,定义成功与总事件、目标、合规期、维度和去重规则。事件进入幂等摄取层,按服务和窗口保存分子、分母、时间边界与水位;聚合层计算错误率、允许错误率和 burn rate。策略层用快窗口发现突发、慢窗口确认持续影响,并检查最小样本量与数据新鲜度。
通知、发布门禁和人工例外是三个消费者。通知可以静默,但预算计算继续;门禁输出带 SLO、窗口、计数、规则和数据版本的证据;例外必须审批、限时并可追溯。迟到数据触发版本化重算,不能悄悄改写已发出的决定。
规模上按服务、区域和租户分片,限制高基数标签,监控摄取延迟、重复、丢失、聚合滞后和通知成功率。用历史回放与故障注入验证策略。数据不完整时标记不确定并升级,而不是把缺失当成零错误。”
常见错误
- 只存 SLO 百分比 → 无法解释样本量和边界 → 保留分子、分母、窗口和水位。
- 一个阈值覆盖所有服务 → 不同风险和流量会产生噪声 → 按目标、样本量和窗口版本化策略。
- 静默等于停止计算 → 团队会丢失预算事实 → 仅抑制通知,继续计算并审计。
- 迟到数据直接改历史 → 发布决定无法复盘 → 版本化重算并保留旧、新值。
- 把缺失数据当健康 → 采集故障被掩盖 → 显示不确定并触发数据质量告警。
- 门禁直接依赖通知状态 → 通知重试会改变发布结果 → 门禁读取不可变评估证据。
追问及应对
为什么需要快窗口和慢窗口?
快窗口降低突发故障的发现时间,慢窗口过滤短暂噪声并确认持续预算消耗。两者组合比单一窗口更能平衡响应速度和误报,但阈值必须结合事件量验证。
回填后 burn rate 变了,旧告警怎么办?
保留旧评估和通知记录,创建带新数据版本的重算结果,并标注是否改变当前门禁。不要删除历史;值班人员需要知道当时系统依据的事实。
如何防止高基数维度拖垮系统?
限制可用标签集合,对租户或路径做分层采样,按需物化高价值切片,并为查询设置成本和超时。核心服务级 SLO 不能依赖无限维度才能成立。
例外策略如何避免永久绕过门禁?
例外必须绑定服务、变更或时间范围,要求审批人、理由和自动过期;过期后恢复默认策略,并把例外覆盖率纳入审计指标。