System Design: 支付系统
· 3 min read
为了解决支付系统中高并发、容错、事务一致性等复杂问题,我们可以尝试应用以下设计模式和关键概念:
1. 断路器模式(Circuit Breaker)
- 作用:防止系统因外部依赖故障而崩溃。
- 外部通信:当调用第三方服务或 API 时,通过断路器监控失败率。
- 服务无响应:若失败阈值触发,断路器"跳闸",直接拒绝请求(快速失败),避免资源耗尽。
- 系统保护:通过降级策略(如返回缓存数据)保证核心功能可用。
典型场景:支付网关超时、数据库连接失败时快速熔断。
2. Saga 模式
- 作用:管理跨服务的分布式事务,替代传统 ACID 事务(性能低、不适用于微服务)。
- 分布式事务:将一个业务逻辑拆分为多个本地事务,按顺序执行。
- 本地事务提交:每个服务独立提交事务(非 2PC,避免长锁)。
- 补偿操作:若某步骤失败,触发逆向补偿操作(如退款、库存回滚)。
类型:
- 协同式:由服务间事件驱动。
- 编排式:通过中央协调器(Orchestrator)控制流程。
典型场景:电商下单(扣库存 → 创建订单 → 支付),若支付失败则补偿库存。
3. 弹性和高性能模式
- 重试:对暂时性故障(如网络抖动)自动重试,需配合退避策略(如指数退避)。
- 幂等操作:同一操作多次执行结果一致(如通过唯一 ID 防止重复扣款)。
- 故障处理:超时控制、限流、负载均衡等,避免级联故障。
工具:Spring Retry、Resilience4j、Hystrix(已停维护)。
4. 交易结算相关概念
- 幂等键(Idempotency Key):客户端生成的唯一标识(如 UUID),服务端据此识别重复请求。
- 唯一键(Unique Key):数据库唯一约束(如订单号),防止数据重复。
- 客户端接受:明确告知客户端请求是否成功(如 HTTP 202 Accepted + 异步回调)。
- 重复请求处理:通过幂等键+去重表(或 Redis 缓存)过滤重复提交。
典型场景:支付接口防重、对账系统确保交易唯一性。
总结对比
模式/概念 | 核心目标 | 关键实现手段 |
---|---|---|
断路器模式 | 故障隔离和快速失败 | 监控 → 熔断 → 恢复 |
Saga 模式 | 分布式事务最终一致性 | 本地事务+补偿 |
弹性模式 | 高可用和容错 | 重试、限流、降级 |
交易结算幂等 | 防止重复操作 | 唯一键、幂等键、状态机 |
这些模式常结合使用,例如:
- 用断路器保护 Saga 中的服务调用,失败时触发补偿;
- 用幂等键确保重试或补偿操作的安全性。
Resources
- System Design Global Payment Processing | Paypal: https://www.youtube.com/watch?v=7MXV7RfNtv0