题目
设计一个高可用的支付系统
信息
- 类型:问答
- 难度:⭐⭐
考点
系统可用性,分布式事务,幂等性设计,限流与熔断,数据一致性
快速回答
设计高可用支付系统的核心要点:
- 分层架构:网关层/业务层/账务层分离
- 分布式事务:采用TCC或Saga模式保证数据一致性
- 幂等控制:通过唯一支付流水号+Redis原子操作实现
- 熔断限流:Hystrix/Sentinel保护核心服务
- 灾备设计:多机房部署+异步对账补偿
1. 架构设计原则
分层架构:
• 网关层:处理协议转换、签名验证、流量控制
• 业务层:支付订单创建、路由选择(银行/第三方)
• 账务层:资金账户操作(扣款/入账)
• 采用微服务架构,模块间通过RPC通信
2. 分布式事务实现
TCC模式示例(转账场景):
// Try阶段
boolean tryTransfer(Transaction tx) {
if (lockAccount(tx.from) && lockAccount(tx.to)) {
tx.status = TRY_SUCCESS;
return true;
}
return false;
}
// Confirm阶段
void confirmTransfer(Transaction tx) {
accountService.debit(tx.from, tx.amount); // 扣款
accountService.credit(tx.to, tx.amount); // 入账
tx.status = CONFIRMED;
}
// Cancel阶段
void cancelTransfer(Transaction tx) {
unlockAccount(tx.from);
unlockAccount(tx.to);
tx.status = CANCELLED;
}Saga模式适用场景:长事务场景(如跨境支付),通过事件驱动状态机管理流程
3. 幂等性设计
支付请求处理流程:
boolean processPayment(String paymentId) {
// Redis原子操作实现幂等锁
if (!redis.setnx(paymentId, "PROCESSING", 30s)) {
return false; // 重复请求直接拒绝
}
try {
// 业务处理...
db.insertPaymentRecord(paymentId, ...);
} finally {
redis.del(paymentId);
}
}关键点:
• 支付流水号全局唯一(业务标识+时间戳+随机数)
• 数据库唯一索引约束防重
4. 高可用保障
熔断限流策略:
• 网关层:令牌桶限流(如Guava RateLimiter)
• 服务层:Hystrix线程隔离+熔断降级
• 配置示例:
- 超时时间:500ms
- 熔断阈值:10秒内50%错误率
- 限流:核心支付接口1000 TPS
多机房部署:
• 同城双活:基于VIP切换
• 异地多活:ShardingSphere分片路由
5. 数据一致性
最终一致性方案:
• 日终对账:比对支付系统与银行流水
• 自动补偿:状态机驱动异常订单修复
• 监控报警:资金不平衡实时通知
6. 最佳实践
- 资金操作:先记录流水再更新账户余额
- 重试机制:指数退避策略+死信队列
- 安全设计:敏感数据加密存储(AES-256)+ 脱敏展示
7. 常见错误
- ❌ 直接使用本地事务跨服务操作
- ❌ 未处理网络超时导致的重复请求
- ❌ 账户余额更新未加乐观锁导致超扣
- ❌ 灾备切换时未考虑数据同步延迟
8. 扩展知识
- 性能优化:热点账户拆分(如支付宝账户分片)
- 新趋势:基于区块链的跨境清算(如SWIFT gpi)
- 容灾指标:RTO≤30s(恢复时间目标),RPO≤5s(数据丢失量)