标准答案

  1. 先确认 P99、错误率、goroutine 数、阻塞栈、队列长度和下游错误是否同时变化。
  2. 区分 channel 无人接收、goroutine 未取消、锁竞争、慢数据库和重试风暴。
  3. 止血可以限流、暂停生产、降级、回滚或重启异常实例,但要保留未完成任务状态。
  4. 恢复后验证 goroutine 基线、积压、重复副作用、数据对账和故障演练结果。

题目解析

事故回答应先把 P99、错误率、goroutine、阻塞栈、channel/队列和下游连接放在同一时间线上,判断是无人接收、取消缺失、锁等待、慢数据库还是重试放大。

止血可以限流、暂停生产、降级、回滚或重启异常实例,但要保存未完成任务和消息状态。GOMAXPROCS 只能调整 Go 代码并行,不会修复泄漏、下游或业务竞态。

恢复验证要看 goroutine 基线、积压、连接、P99 和数据对账,并说明 channel 的 owner/关闭、context 取消、重试和幂等如何防止问题再次发生。

常见误区

  • 误区:只说增加 GOMAXPROCS。改正:先定位阻塞、泄漏、锁、下游和重试,GOMAXPROCS 只是一个调度参数。
  • 误区:只重启服务不分析泄漏。改正:重启用于止血,同时保存 dump、任务状态和增长趋势定位根因。
  • 误区:不说明 channel 关闭、任务重试和业务幂等。改正:明确并发所有权、取消协议和最终副作用保护。

作者信息