代表性面试主题

系统设计面试:设计多区域流量调度与故障切换

系统设计困难
Offer.cc 编辑团队发布 更新

题干

请设计一个将全球请求调度到多个区域的服务。它需要按延迟选择区域,在区域故障或容量不足时安全切换,同时控制 DNS 缓存、数据一致性、容量和回切风险。

题目与使用场景

这是一个多区域高可用设计题。重点不是画出多个区域,而是说明流量决策依据、健康信号传播、故障时的容量与数据边界,以及如何演练和回切。

面试官考察什么

  • 是否区分 DNS、边缘代理和应用层路由的职责与时效。
  • 是否使用多来源、分层的健康信号,而不是只探测一个端点。
  • 是否计算故障转移后的容量、连接和限流压力。
  • 是否明确有状态数据的读写、复制延迟和区域约束。
  • 是否防止脑裂、振荡切换和回切放大事故。
  • 是否定义 RTO、RPO、SLO 与演练证据。

作答前的澄清问题

  • 目标区域、流量峰值和单区域失效模型是什么?
  • RTO、RPO、数据驻留和合规限制是什么?
  • 请求是无状态读为主,还是包含写入和长连接?
  • 调度粒度是 DNS、Anycast、边缘代理还是服务网格?
  • 健康判定需要哪些用户路径和依赖检查?
  • 客户端 DNS TTL、连接迁移和回切窗口有什么要求?

30 秒回答框架

“我先定义单区域故障、峰值和 RTO/RPO。入口由边缘或 DNS 按延迟选择候选区域,但只把通过多层健康检查且有余量的区域放入集合。区域容量不足时逐步降级和限流,避免把故障流量压垮备用区。写请求遵循数据主从或分片边界,明确复制延迟和重试语义。切换由有抖动保护的控制器执行,回切前先演练、预热并验证指标。”

分步骤深入解答

步骤 1:定义故障与目标。 写出区域、依赖、网络和控制面的故障范围,并把 RTO、RPO、峰值和降级等级量化。

步骤 2:分离决策层。 DNS 或全局入口负责粗粒度区域选择,边缘/服务层负责实时权重、连接和局部限流;不要让单一控制面承载全部故障切换。

步骤 3:构建健康信号。 结合多地点探针、关键用户路径、依赖状态、错误率和容量水位;连续失败、恢复窗口和多数判定用于避免瞬时抖动。

步骤 4:计算容量保护。 预留备用余量,设置每区域并发、队列和速率上限;故障时按优先级丢弃非关键流量,避免级联过载。

步骤 5:处理数据边界。 说明读副本延迟、写入归属、冲突解决、幂等键和跨区域重试;路由切换不能掩盖数据不可写的事实。

步骤 6:执行切换。 控制器记录原因、版本和审批,逐步降低故障区权重,先小比例导流,再扩大;长连接需要重连退避和会话恢复策略。

步骤 7:回切与演练。 备用区预热、指标稳定并完成数据校验后再回切;定期注入区域、依赖和控制面故障,保存真实 RTO/RPO 证据。

高质量示范回答

“我会把每个区域分成入口、无状态服务和数据单元。全局入口按延迟选候选区域,但只有同时满足多地点关键路径检查、错误率阈值和容量余量的区域才接收流量。控制器对权重变化设置最小持续时间和冷却期,先把 5% 流量导向备用区;若备用区达到并发上限,优先保护登录和写入,暂停低优先级报表。写入按租户归属区域处理,跨区重试带幂等键并暴露复制延迟。切换和回切都通过演练验证 RTO、RPO、重连成功率和数据校验结果。”

常见错误

  • 只画 DNS 和两个区域 → 忽略容量与数据 → 补充控制器、护栏和写入边界。
  • 单次探针失败就摘除区域 → 产生振荡 → 使用连续窗口、冷却期和多数信号。
  • 默认备用区能接收全部流量 → 故障时级联过载 → 计算余量并设置分级降级。
  • 把 TTL 当成切换完成时间 → 客户端仍缓存旧结果 → 说明连接、缓存和边缘层的实际时延。
  • 只说 active-active → 没有冲突策略 → 明确写入归属、复制与幂等。

追问及应对

追问 1:DNS TTL 很长怎么办?

让边缘入口承担更快的权重调整,并把 TTL、递归缓存和连接存活时间纳入 RTO 预算;不能承诺瞬时切换。

追问 2:健康检查本身故障怎么办?

使用多地点、多探针和独立控制面,记录探针新鲜度;检查过期时保持上次安全状态或进入人工保护模式。

追问 3:备用区容量不够怎么办?

预留容量并在切换前预热,按优先级限流、降级或排队;用压测证明单区域故障下的上限。

追问 4:如何避免切换来回震荡?

设置失败与恢复的不同阈值、最小驻留时间、冷却期和人工确认,记录每次权重变化原因。

追问 5:跨区写入出现冲突怎么办?

优先按租户或键指定写入归属,使用版本或幂等条件;若必须多主,明确冲突规则与不可自动合并的数据。

追问 6:如何证明设计有效?

演练区域、依赖、网络和控制面故障,测量 RTO、RPO、错误率、恢复容量、重连成功率和数据校验结果。

追问 7:什么时候不该做多区域?

当数据驻留、复制语义、运营能力或成本无法满足目标时,先做单区域加可验证的灾备;多区域不是默认答案。

公开来源

同类题目

相关面试工具

用 Solve 整理系统设计回答

从澄清需求开始,展开规模、架构、组件选择和取舍。

查看工具