支付系统高可用架构设计
支付系统对可用性要求极高,本文分享高可用架构的设计思路。
架构目标
| 指标 | 目标 | 说明 |
|---|---|---|
| 可用性 | 99.99% | 年停机时间<53分钟 |
| 响应时间 | P99<200ms | 用户体验保障 |
| 数据一致性 | 100% | 资金安全底线 |
整体架构
┌─────────────────┐
│ 负载均衡层 │
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ API网关 │ │ API网关 │ │ API网关 │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└──────────────┼──────────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ 业务服务 │ │ 业务服务 │ │ 业务服务 │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└──────────────┼──────────────┘
│
┌────────┴────────┐
│ 数据存储层 │
└─────────────────┘
多活部署
异地多活策略
regions:
- name: beijing
role: master
weight: 60
- name: shanghai
role: slave
weight: 40
流量调度
public class RegionRouter {
public String route(Request request) {
// 根据用户地理位置选择最近机房
String userRegion = geoService.getRegion(request.getIp());
return regionConfig.getEndpoint(userRegion);
}
}
容灾切换
健康检查
@Scheduled(fixedRate = 5000)
public void healthCheck() {
for (Region region : regions) {
boolean healthy = checkHealth(region);
if (!healthy && region.isActive()) {
failover(region);
}
}
}
切换流程
- 检测故障:连续3次检测失败
- 流量切换:更新DNS/负载均衡
- 数据同步:确保数据一致性
- 通知告警:运维团队介入
数据一致性
分布式事务
@Transactional
public void transfer(TransferRequest request) {
// 1. 扣减余额
accountService.debit(request.getFrom(), request.getAmount());
// 2. 记录流水
transactionLogService.log(request);
// 3. 增加余额
accountService.credit(request.getTo(), request.getAmount());
}
幂等设计
public Response process(Request request) {
String idempotentKey = request.getIdempotentKey();
// 检查是否已处理
if (processedCache.exists(idempotentKey)) {
return processedCache.get(idempotentKey);
}
// 处理请求
Response response = doProcess(request);
// 缓存结果
processedCache.set(idempotentKey, response, 24 * 3600);
return response;
}
监控告警
关键指标
- 交易成功率
- 平均响应时间
- 系统错误率
- 队列积压量
告警规则
alerts:
- name: high_error_rate
expr: error_rate > 0.01
duration: 1m
severity: critical
实践建议
- 压测验证:定期进行全链路压测
- 混沌工程:模拟故障验证恢复能力
- 文档演练:确保故障处理流程清晰