SWE / Tech Lead · VO System Design

Microsoft 大规模软件发布:分环灰度、健康门槛与回滚

把大规模 rollout 拆成目标群体、版本分发、健康观测、逐环放量、暂停回滚和审计。

题目重点:把大规模 rollout 拆成目标群体、版本分发、健康观测、逐环放量、暂停回滚和审计。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版支持服务端组件发布,部署目标按 region/cluster 划分;若原题是桌面软件/设备端更新,离线、签名和带宽模型应重新讨论。
  • 发布单元含不可变 artifact、版本、配置、依赖和回滚目标;数据迁移遵循前后版本兼容窗口。
  • 成功不仅是部署完成,还包括错误率、延迟、业务护栏和用户影响在门槛内。

解题路线

  1. 先问系统形态、同时在线实例数、地域、可用性目标、依赖及允许多久传播;明确 artifact 签名、SBOM/来源和版本固定。
  2. 控制面定义 rolloutId、目标集合、ring 顺序、每环比例、并发上限、批准人和健康门槛;数据面从区域镜像/缓存拉不可变 artifact,避免中心仓库被并发下载打爆。
  3. 按内部→小比例 canary→更多 region/ring 扩散,每环等待足够观察窗口;比较新旧版本的错误率、p95 延迟、关键业务转化与资源使用,考虑流量构成差异。
  4. 控制器以目标实例为幂等单位记录 desired/observed 版本,重试安装不重复执行危险迁移;限制每故障域同时替换数,留足健康副本。
  5. 门槛失败自动暂停并保留证据,再按兼容策略回滚二进制/配置;不可逆 schema 迁移须采用 expand-migrate-contract,不能只靠把旧镜像重新启动。
  6. 区域断网或控制面失效时目标实例继续上一个已验证版本,发布计划可恢复;审计谁批准、何时对哪些目标放量和回滚。

手动走一遍

新版本先到单一区域 1% 实例,CPU 持平但支付成功率下降,控制器因业务护栏失败暂停扩散。即使发布系统报告所有 canary 实例健康,也不能继续。回滚前确认新版本写入的数据旧版本仍可读,否则先执行兼容修复。

规模与取舍

若目标实例 N、每环并发上限 C,部署波次数至少 ceil(N/C),再乘每环健康观察时间;artifact 传输量约 N×包大小但缓存/分层分发可减少中心出口。发布状态 O(N);题目无规模数值,不能断言具体机器数。

易错点与追问

容易失分的边界

  • 一次推所有实例,没有故障域隔离和用户护栏。
  • 只看 pod/进程存活,不看错误率与业务结果。
  • 把回滚理解为换回旧镜像,忽略不兼容数据迁移。
  • 控制面重试导致同一 migration 重复执行。
  • 把 Rust 改写背景说成原题限定。

继续深挖

  • 客户端离线几周后恢复时怎样安全跨版本升级?
  • 实验流量和 canary 分流的地域偏差如何校正?
  • 数据库 schema 必须先发还是应用先发?
  • 极端大包如何使用区域缓存或差分更新?
✓已复制微信号!