← All incidents

[Eval][v3][zh] Third-party payment gateway timeouts cascade into checkout outage

service: checkout-svccreated: 6/2/2026, 11:39:15 PM

Raw incident context

Time: 18:40 UTC. checkout-svc starts returning HTTP 504 to ~78% of checkout attempts.

Symptoms:
- p99 latency: 28s (hitting our 30s gateway timeout)
- Success rate: 22% (down from 99.5%)
- Thread pool utilization: 100% (all 200 worker threads blocked)
- Inbound queue depth: 4200 requests (queue limit 5000)

Downstream calls (from APM):
- Stripe Connect API (/v1/payment_intents): p99 jumped from 800ms to 27s
- Stripe status page: "Investigating elevated latency for Connect endpoints in us-east-1" (posted 18:35 UTC)
- All other downstream deps (auth-svc, fraud-svc) normal

Our config:
- Stripe call timeout: 30s (matches inbound)
- No circuit breaker on Stripe client
- No bulkhead — Stripe calls share the main worker thread pool

Customer impact:
- Failed checkouts: ~3000 in 5min
- Estimated lost GMV: $180k (so far)

On-call:
- 18:38 — pager
- 18:41 — confirmed Stripe is the culprit (status page + APM)
- 18:43 — debating: wait it out vs disable Stripe path entirely

Summary

SEV1

结账服务(checkout-svc)因依赖的 Stripe Connect API 出现严重延迟,导致线程池耗尽,结账成功率从 99.5% 骤降至 22%,p99 延迟达到 28 秒,接近 30 秒超时阈值。当前已确认 Stripe 状态页面报告 us-east-1 区域 Connect 端点延迟升高,且无断路器或舱壁隔离机制。

Severity reasoning: 用户可见的结账失败率达 78%(>1%),且持续超过 5 分钟,直接阻断收入路径(已损失约 $180k GMV),符合 SEV1 标准。

deepseek-chat·prompt v3·output: zh·12060ms·2413↑ / 1946↓ tok·$0.00279

Root cause hypotheses

  • highStripe Connect API 在 us-east-1 区域出现延迟飙升,导致 checkout-svc 的 HTTP 调用阻塞线程池。

    Evidence: APM 显示 Stripe /v1/payment_intents 的 p99 延迟从 800ms 升至 27s;Stripe 状态页面于 18:35 UTC 确认问题。

  • highcheckout-svc 的线程池被 Stripe 调用完全占满,导致新请求排队并超时。

    Evidence: 线程池利用率 100%(200 个 worker 线程全部阻塞),入站队列深度 4200(上限 5000),与 Stripe 延迟升高时间吻合。

  • mediumStripe 客户端未配置超时或超时设置过长,导致线程长期挂起。

    Evidence: Stripe 调用超时设为 30s,与入站超时一致,但无断路器或舱壁隔离,导致单个下游问题扩散。

  • lowStripe 调用失败后重试逻辑导致请求堆积。

    Evidence: 当前无证据表明重试机制存在,但常见配置可能导致指数退避失败。需检查代码。

Investigation checklist

  1. 确认 Stripe 状态页面是否更新
    curl -s https://status.stripe.com/api/v2/incidents/current.json | jq '.incident.status'

    Expected: 返回 'investigating' 或 'identified',确认问题仍在进行中

  2. 检查线程池和队列深度当前值
    curl -s http://checkout-svc:8080/actuator/metrics/jetty.threads.utilization | jq '.measurements[0].value'

    Expected: 值接近 1.0(100%),确认线程池仍耗尽

  3. 查看最近 5 分钟 Stripe 调用延迟分布
    kubectl logs -n prod -l app=checkout-svc --since=10m | grep 'stripe' | awk '{print $NF}' | sort -n | tail -20

    Expected: 显示大量调用延迟 > 25s,确认 Stripe 是瓶颈

  4. 检查是否有其他下游依赖异常
    kubectl logs -n prod -l app=checkout-svc --since=10m | grep -E 'auth-svc|fraud-svc' | awk '{print $NF}' | sort -n | tail -10

    Expected: 延迟正常(< 1s),排除其他依赖问题

  5. 验证 Stripe 客户端配置(超时、重试、断路器)
    kubectl exec -n prod deploy/checkout-svc -- cat /app/config/stripe.yaml | grep -E 'timeout|retry|circuit|bulkhead'

    Expected: 显示超时 30s,无断路器或舱壁配置

Mitigation plan

  • 启用功能开关,临时禁用 Stripe 支付路径,降级为仅支持非 Stripe 支付方式(如 PayPal 或货到付款),以恢复结账成功率。

    Risk: 部分用户无法使用 Stripe 支付,可能影响转化率,但可避免完全失败。需确保降级路径已测试。

    Rollback: 重新启用 Stripe 支付路径(通过功能开关回滚)

  • 在 Stripe 客户端添加断路器(如 Hystrix 或 Resilience4j),当错误率超过 50% 时快速失败,避免线程池耗尽。

    Risk: 断路器配置不当可能导致误判或雪崩;需谨慎设置阈值和半开状态。

    Rollback: 移除断路器配置或调整阈值

  • 为 Stripe 调用配置独立的线程池(舱壁隔离),限制最大并发数(如 20),保护主线程池。

    Risk: 增加资源开销;需调整线程池大小以避免饥饿。

    Rollback: 恢复为共享线程池配置

Customer impact

约 78% 的结账尝试失败,用户看到 HTTP 504 错误或超时。过去 5 分钟内约 3000 笔交易失败,估计损失 GMV $180k。Stripe 支付方式暂时不可用,其他支付方式可能正常。

Postmortem draft

摘要

[FILL IN: 简要描述事件] 结账服务因 Stripe API 延迟导致线程池耗尽,影响 78% 用户。

时间线 (UTC)

  • 18:35 - Stripe 状态页面报告 Connect 端点延迟升高
  • 18:40 - checkout-svc 开始返回 504,告警触发
  • 18:41 - 确认 Stripe 为根因
  • 18:43 - 讨论降级方案
  • [FILL IN: 实际缓解时间]

影响

  • 结账成功率从 99.5% 降至 22%
  • p99 延迟 28s
  • 约 3000 笔交易失败,损失 $180k GMV

根因

Stripe Connect API 在 us-east-1 区域延迟飙升,导致 checkout-svc 线程池耗尽。缺乏断路器或舱壁隔离机制使问题扩散。

检测

告警基于成功率下降触发,但延迟告警可能未配置。

响应

  • 18:38 分页响应
  • 18:41 确认根因
  • 后续降级措施 [FILL IN]

做得好的

  • 快速识别 Stripe 为根因
  • 状态页面验证有效

做得不好的

  • 无断路器导致级联故障
  • 无舱壁隔离
  • 降级决策延迟

行动项

  • [ ] 为 Stripe 客户端添加断路器 (P0)
  • [ ] 实施舱壁隔离 (P0)
  • [ ] 增加延迟告警 (P1)
  • [ ] 演练降级流程 (P2)

Follow-ups

  • P0为 Stripe 客户端添加断路器(如 Resilience4j),配置错误率阈值 50% 和超时 5s支付平台团队
  • P0实施舱壁隔离,为 Stripe 调用分配独立线程池,最大并发 20平台工程团队
  • P1增加 Stripe 调用延迟告警(p99 > 2s 持续 1 分钟)可观测性团队
  • P1制定并演练 Stripe 降级流程,包括功能开关和用户通知SRE 值班团队
  • P2审查所有下游依赖的容错配置(超时、重试、断路器)服务所有者
  • P2更新 postmortem 模板,增加第三方依赖故障场景SRE 团队