← All incidents

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

service: checkout-svccreated: 6/2/2026, 11:59:23 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 延迟飙升(p99 从 800ms 升至 27s)导致线程池耗尽,78% 的结账请求超时失败,成功率从 99.5% 骤降至 22%,已影响约 3000 笔交易,损失 GMV 约 $180k。

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

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

Root cause hypotheses

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

    Evidence: Stripe 状态页面于 18:35 UTC 发布 'Investigating elevated latency for Connect endpoints in us-east-1';APM 显示 Stripe /v1/payment_intents 的 p99 延迟从 800ms 升至 27s。

  • highcheckout-svc 缺乏对 Stripe 调用的熔断器或隔离机制,导致单个下游故障耗尽所有工作线程。

    Evidence: 配置中无 circuit breaker,且 Stripe 调用与主线程池共享,无 bulkhead 隔离。线程池利用率 100%,所有 200 个线程被阻塞。

  • mediumStripe 调用超时设置(30s)与网关超时一致,导致请求在等待 Stripe 响应时堆积,最终触发线程池耗尽。

    Evidence: p99 延迟 28s 接近 30s 超时,入站队列深度 4200(接近上限 5000),表明请求在排队等待线程。

  • lowStripe 客户端连接池配置不足,导致连接等待加剧延迟。

    Evidence: 无直接证据,但常见于高并发场景;可检查连接池大小和等待队列。

Investigation checklist

  1. 确认 Stripe 状态页面是否更新
    curl -s https://status.stripe.com/api/v1/incidents | jq '.incidents[] | select(.status != "resolved")'

    Expected: 返回当前未解决的事件,确认 Stripe 仍在调查中。

  2. 检查 checkout-svc 线程池和队列深度
    kubectl exec -n prod deploy/checkout-svc -- curl -s localhost:8080/actuator/metrics/jetty.threads.utilization | jq '.measurements[0].value'

    Expected: 值接近 1.0(100% 利用率),确认线程池耗尽。

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

    Expected: 显示大量请求延迟接近 30s,确认 Stripe 调用超时。

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

    Expected: 延迟正常(<100ms),排除其他下游故障。

  5. 验证 Stripe 客户端连接池配置
    kubectl exec -n prod deploy/checkout-svc -- cat /app/config/application.yml | grep -A5 'stripe'

    Expected: 显示连接池大小和超时设置,确认是否过小。

Mitigation plan

  • 启用熔断器:在 Stripe 客户端配置熔断器,当错误率 >50% 时快速失败,避免线程池耗尽。

    Risk: 熔断后 Stripe 支付功能完全不可用,但可保护系统整体。

    Rollback: 移除熔断器配置或设置阈值恢复。

  • 临时禁用 Stripe 支付路径,将流量切换到备用支付提供商(如 PayPal)或降级为仅展示错误提示。

    Risk: 客户无法使用信用卡支付,可能影响转化率;备用提供商需提前集成。

    Rollback: 重新启用 Stripe 路径。

  • 增加线程池大小(如从 200 增至 400)以吸收突发流量,但需注意资源限制。

    Risk: 可能增加内存压力,导致 OOM;仅作为临时缓解。

    Rollback: 恢复原线程池大小。

  • 降低 Stripe 调用超时(如从 30s 降至 5s),快速失败释放线程。

    Risk: 正常慢请求可能被误杀,但当前 Stripe 已异常,影响有限。

    Rollback: 恢复原超时设置。

Customer impact

约 78% 的结账请求失败,用户看到 504 超时错误,无法完成支付。过去 5 分钟内约 3000 笔交易失败,预计损失 $180k。

Postmortem draft

事后复盘

摘要

checkout-svc 因 Stripe Connect API 延迟飙升导致线程池耗尽,结账成功率从 99.5% 降至 22%,持续约 [FILL IN] 分钟。

时间线(UTC)

  • 18:35 - Stripe 状态页面发布延迟问题
  • 18:38 - 收到告警
  • 18:41 - 确认 Stripe 为根因
  • 18:43 - 讨论缓解方案
  • [FILL IN] - 实施缓解措施
  • [FILL IN] - 服务恢复

影响

  • 失败结账数:~3000
  • 损失 GMV:~$180k
  • 影响用户:未知

根因

Stripe Connect API 在 us-east-1 区域出现延迟问题,导致 checkout-svc 的 HTTP 调用阻塞,线程池耗尽。

检测

通过 APM 和 Stripe 状态页面快速定位。

响应

  • 18:38 告警响应
  • 18:41 确认根因
  • 讨论等待 vs 禁用 Stripe 路径

做得好的

  • 快速定位到 Stripe 依赖
  • 使用状态页面确认外部故障

做得不好的

  • 缺乏熔断器和隔离机制
  • 无备用支付提供商

行动项

  • [ ] 为 Stripe 客户端添加熔断器
  • [ ] 实现 bulkhead 隔离
  • [ ] 集成备用支付提供商
  • [ ] 优化超时设置

Follow-ups

  • P0为 Stripe 客户端添加熔断器(如 Hystrix 或 Resilience4j)checkout-svc 团队
  • P0实现线程池隔离(bulkhead),将 Stripe 调用分离到独立线程池checkout-svc 团队
  • P1集成备用支付提供商(如 PayPal)作为降级方案支付平台团队
  • P1优化 Stripe 调用超时设置,避免与网关超时一致checkout-svc 团队
  • P2增加对 Stripe 状态页面的自动监控和告警SRE 团队
  • P2演练熔断和降级流程SRE 团队