其他热门公司 — Stripe / Snowflake / Databricks / Coinbase / Uber · Snowflake

如何处理意外生产事故。

Tell me about handling an unexpected production incident.

答案语言

考察要点

这道题旨在评估你在高压、信息不全情况下的判断力、技术深度和领导力。对于亚马逊,它直接映射到以下 Leadership Principles (LP):

  1. Ownership: 你是否主动承担起解决问题的全部责任,从发现问题到最终复盘,而不是指责或等待他人。
  2. Dive Deep: 你是否能迅速深入技术细节,通过数据和日志定位根本原因,而不是停留在表面现象。
  3. Earn Trust: 在混乱中,你如何与同事、管理者清晰沟通,建立信任,并协同行动。

高分示范答案(STAR)

Situation(背景) 大约一年前,我在一家电商公司担任支付核心服务团队的 SDE II(团队共 8 人)。我当时是负责处理用户付款请求和调用第三方支付渠道的核心服务的 on-call 工程师。这个服务是整个交易漏斗最关键的一环,任何抖动都会直接导致公司收入损失。

Task(任务) 在周二凌晨 2 点,我收到了 P0 级别的告警,监控系统显示我们服务的支付成功率在 15 分钟内从 99.95% 暴跌至不足 40%。我的任务是立即响应,在尽可能短的时间内恢复服务,并把对用户和收入的影响降到最低。

Action(行动) 接到告警后,我立刻采取了以下行动:

  • 第一步:快速评估影响并建立沟通渠道。 我首先打开了业务看板,确认了影响范围是全局性的,所有支付方式都受到了影响。我立即在 Slack 上创建了一个名为 #incident-payment-failure 的频道,并拉入了我的经理、团队的 Principal Engineer 以及我们依赖的下游服务(第三方支付网关)的 on-call 工程师。我在频道里通报了现状:“支付成功率从 99.95% 降至 40%,初步估计每分钟损失交易额约 10 万美元,正在排查。” 这确保了所有关键干系人信息同步。
  • 第二步:深入日志和指标进行根因分析(Dive Deep)。 我首先排除了我们自身服务的问题。通过查看 Datadog,我发现我们服务的 CPU、内存和网络 I/O 均正常,并且最近 12 小时内我们没有任何部署或配置变更。然而,我注意到我们服务对“支付网关-B”的 API 调用超时率从 0.01% 飙升到 60% 以上。我立刻用 Splunk 查询相关日志,发现了大量的 Connection Timeout 错误。这个证据让我把怀疑的焦点锁定在了支付网关-B。
  • 第三步:推动并执行解决方案(Ownership & Bias for Action)。 我立即在频道里 @ 了支付网关-B 的 on-call,并分享了我的发现(超时率截图和关键日志)。对方起初认为他们的服务是正常的,因为他们的核心指标没有告警。我指出,问题可能出在他们与我们服务之间的网络链路上,或者他们最近的某个“非核心”变更上。为了快速恢复业务,我提出了一个紧急预案:通过我们的动态路由配置,将所有流向支付网关-B 的流量立刻切换到备用的支付网关-C 上。这个操作有一定风险,因为网关-C 的费率更高,但相比于交易完全失败,这是当下最好的选择。我向经理阐明了利弊,并获得了执行许可。
  • 第四步:验证结果并推动根因修复。 我在配置中心修改了路由权重,将支付网关-B 的流量降为 0。在 2 分钟内,我观察到支付成功率迅速回升至 99.9% 以上。危机解除后,我并没有就此结束。我持续与支付网关-B 的团队沟通,最终他们发现,他们在 1 小时前做了一次防火墙规则的变更,错误地限制了来自我们服务集群的 TCP 连接。在他们回滚了变更后,我将一小部分流量(10%)切回网关-B 进行测试,确认问题解决后,才完全恢复了正常的路由策略。

Result(结果)

  • 业务恢复:从接到告警到通过切换路由恢复核心业务,总共用时 35 分钟。支付成功率从不足 40% 恢复到 99.95%。
  • 量化影响:根据估算,这次快速响应为公司挽回了约 300 万美元的潜在交易额损失。
  • 机制改进:事后,我主动发起了这次事件的 Postmortem(事后复盘),并推动了一个跨团队的改进项:要求所有网络或防火墙变更,都必须纳入自动化集成测试,并在变更后进行关键业务链路的拨测。这个机制杜绝了此类事件的再次发生。

低分陷阱(常见扣分点)

  1. 行动主体是“我们”:面试官想知道“你”做了什么。
    • 反例:“我们团队很快就发现了问题,然后我们决定切换流量。”
    • 分析:谁发现的?谁做的决定?谁执行的?完全没有体现个人贡献。
  2. 结果含糊不清,没有量化:无法衡量你的工作价值。
    • 反例:“问题很快就解决了,项目很成功。”
    • 分析:“很快”是多久?“成功”的标准是什么?和“35 分钟内恢复,挽回 300 万美元损失”相比,说服力天差地别。
  3. Action 变成流水账,缺乏决策思考:只说做了什么,不说为什么这么做。
    • 反例:“我先看了 A,又看了 B,然后重启了 C。”
    • 分析:为什么先看 A?A 和 B 之间有什么关联?为什么重启 C 是最佳方案而不是回滚?要展示你的思考过程和权衡取舍。
  4. 指责他人(Blame Game):显得不专业,缺乏 Ownership。
    • 反例:“都是因为另一个团队乱改配置,才导致了我们的服务崩溃。”
    • 分析:正确的姿态是“我发现了一个来自依赖服务的变更可能是原因,并与他们合作解决了问题”,强调协作和解决问题,而非归咎责任。

高概率追问(3 个 + 示范回答要点)

  1. 追问:在你说服支付网关团队时,如果他们坚持认为不是他们的问题,你会怎么办?

    • 要点 1 (升级沟通):我会立即将情况升级。在 war room 里 @ 双方的总监或 VP,用量化的业务损失(每分钟损失多少钱)来强调问题的严重性,请求更高级别的介入来做决策。
    • 要点 2 (提供更多证据):同时,我会继续深挖。比如,我会尝试从我们的机器上用 curltelnet 直接访问他们的服务端口,提供更直接的网络层面证据。我会请求他们提供他们那一侧面向我们服务的访问日志,进行交叉比对。
    • 要点 3 (聚焦于恢复业务):我会重申,我的首要目标是恢复业务,而不是确定责任方。即使他们不认可,我也会坚持执行我的降级方案(切换到备用网关),先把问题解决。责任划分可以在事后复盘时再讨论。
  2. 追问:你提到的“动态路由切换”方案,在执行前你如何评估它的风险?

    • 要点 1 (预案准备):这个动态路由能力是我们之前为了应对类似情况而专门构建的,我们对它进行过多次演练。我知道这个操作本身是秒级生效且可靠的。
    • 要点 2 (风险评估):主要的风险有两个:第一,备用网关-C 的容量是否足够支撑全量业务。我快速查看了网关-C 的容量监控面板,确认其当前负载低于 30%,有足够冗余。第二,切换后可能会有数据不一致的风险。但我知道我们的支付流程设计是幂等的,即使少量请求在切换瞬间失败,用户重试后也会在新通路上成功,不会造成资金风险。
    • 要点 3 (成本考量):我清楚备用网关-C 的费率比网关-B 高 0.2%。我快速心算了一下,相比于交易额的大量损失,这点增加的成本完全可以接受。我在向经理汇报时也提到了这一点。
  3. 追问:这次事件后,你学到了什么?对你未来的工作有什么影响?

    • 要点 1 (防御性编程与设计):我更深刻地理解了“Design for Failure”的理念。依赖的服务随时可能出问题,必须有快速的熔断、降级和切换机制。此后,我在做任何新的系统设计时,都会把依赖项的健康检查和紧急预案作为一等公民来考虑。
    • 要点 2 (沟通的重要性):在高压下,清晰、简洁、基于数据的沟通至关重要。建立一个集中的沟通渠道(war room)并保持高频同步,能极大地减少混乱,凝聚团队力量。
    • 要点 3 (超越本职):解决问题不应止步于恢复服务。推动根本性的机制改进(如自动化测试、变更流程规范)才是工程师体现更大价值的地方。我把组织 Postmortem 和跟进 Action Items 变成了自己的一个工作习惯。

故事复用建议

这个故事非常扎实,除了回答“处理生产事故”外,还可以稍作调整,用于回答以下问题:

  • Ownership: 整个故事都是 Ownership 的体现,尤其是主动发起复盘。
  • Bias for Action: 在信息不全时,果断做出切换流量的决定。
  • Deliver Results: 结果部分直接证明了你交付了高影响力的业务成果。
  • Tell me about a time you worked under pressure.
  • Tell me about a time you had to make a critical decision with limited information.
  • Tell me about a time you had to influence another team to get something done. (说服网关团队的部分)