1. 支付核心系统设计概述
支付系统作为现代商业基础设施的核心组件,其设计质量直接影响着企业的资金流转效率和用户体验。一套优秀的支付核心系统应当具备高可用性、强一致性、可扩展性和安全性等关键特性。在实际项目中,我们通常会面临交易峰值波动、资金对账复杂、多支付渠道整合等挑战。
从技术架构角度看,支付系统需要处理的核心问题包括:交易流水处理、资金账户管理、对账清算、风控拦截等。这些模块之间需要高度协同,同时保持适当的解耦。以电商平台为例,支付系统每天需要处理数百万笔交易,金额从几元到数万元不等,这对系统的稳定性和准确性提出了极高要求。
2. 核心模块设计
2.1 交易引擎设计
交易引擎是支付系统的中枢神经,负责处理支付请求的全生命周期。我们采用分布式事务框架保证ACID特性,具体实现上:
- 交易流水表设计:
CREATE TABLE payment_transaction ( id BIGINT PRIMARY KEY, trade_no VARCHAR(64) UNIQUE, merchant_id BIGINT NOT NULL, amount DECIMAL(18,2) NOT NULL, currency VARCHAR(3) DEFAULT 'CNY', status TINYINT NOT NULL COMMENT '0-初始化 1-处理中 2-成功 3-失败', create_time DATETIME NOT NULL, update_time DATETIME NOT NULL, INDEX idx_merchant (merchant_id), INDEX idx_create_time (create_time) ) ENGINE=InnoDB;- 状态机实现:
public enum TransactionStatus { INIT { @Override public boolean canTransferTo(TransactionStatus nextStatus) { return nextStatus == PROCESSING; } }, PROCESSING { @Override public boolean canTransferTo(TransactionStatus nextStatus) { return nextStatus == SUCCESS || nextStatus == FAILED; } }, // 其他状态... }关键点:状态转换必须严格校验前置状态,避免出现状态跳跃
2.2 账户体系设计
资金账户系统需要处理复杂的并发记账问题。我们采用账户分库分表+分布式锁的方案:
- 账户分片策略:
// 按商户ID取模分片 public String determineAccountShard(Long merchantId) { int shardCount = 32; return "account_" + (merchantId % shardCount); }- 资金变更SQL示例:
UPDATE account_balance SET balance = balance + #{amount}, frozen_amount = frozen_amount - #{amount}, version = version + 1 WHERE account_id = #{accountId} AND version = #{version}常见问题处理:
- 余额不足时快速失败
- 重复请求幂等处理
- 资金变动记录完整审计
3. 渠道接入层设计
3.1 统一支付网关
支付渠道的多样性(微信、支付宝、银联等)要求系统具备良好的扩展性。我们定义标准支付接口:
public interface PaymentChannel { PaymentResult pay(PaymentRequest request); PaymentResult query(String tradeNo); RefundResult refund(RefundRequest request); }渠道配置表示例:
| 渠道编码 | 渠道名称 | 费率(%) | 单笔限额 | 日限额 | 状态 |
|---|---|---|---|---|---|
| WXPAY | 微信支付 | 0.6 | 50000 | 1000000 | 1 |
| ALIPAY | 支付宝 | 0.55 | 100000 | 5000000 | 1 |
3.2 智能路由策略
根据业务规则自动选择最优支付渠道:
- 路由规则配置:
routes: - condition: "amount <= 1000 && channelType == 'BANK'" priority: 1 channel: "QUICK_PAY" - condition: "time >= 22:00 || time <= 8:00" priority: 2 channel: "ALIPAY"- 路由决策流程:
开始 ↓ 获取所有可用渠道 ↓ 过滤不符合限额要求的渠道 ↓ 按手续费从低到高排序 ↓ 选择第一个可用渠道 ↓ 返回渠道信息4. 风控与对账系统
4.1 实时风控规则
风控规则引擎采用Drools实现示例:
rule "LargeAmountCheck" when $t : Transaction(amount > 50000) then insert(new RiskEvent($t, "AMOUNT_TOO_LARGE")); end rule "FrequencyCheck" when $t : Transaction( $cardNo : cardNo, $merchant : merchantId ) Number(intValue > 5) from accumulate( Transaction( cardNo == $cardNo, merchantId == $merchant, this after[0s,5m] $t ), count(1) ) then insert(new RiskEvent($t, "FREQUENCY_TOO_HIGH")); end4.2 对账处理流程
每日对账关键步骤:
- 下载渠道对账文件
- 解析并入库对账记录
- 执行自动对账(基于交易号+金额匹配)
- 生成差错交易报表
- 人工处理不平账目
对账差异类型处理:
| 差异类型 | 处理方式 | 自动处理 |
|---|---|---|
| 长款(我们有记录,渠道无) | 发起查询 | 否 |
| 短款(渠道有记录,我们无) | 补单处理 | 是 |
| 金额不一致 | 人工核查 | 否 |
5. 性能优化实践
5.1 缓存策略
采用多级缓存架构:
- 本地缓存(Caffeine):存储热点账户信息
- 分布式缓存(Redis):存储交易流水状态
- 数据库:持久化存储
缓存更新策略:
@CacheEvict(value = "account", key = "#accountId") public void updateAccountBalance(Long accountId, BigDecimal amount) { // 更新数据库 }5.2 数据库优化
支付系统典型SQL优化案例:
- 避免全表扫描:
-- 反例 SELECT * FROM transaction WHERE status = 1; -- 正例 SELECT id, trade_no FROM transaction WHERE status = 1 AND create_time > '2023-01-01' LIMIT 1000;- 索引优化:
-- 复合索引 ALTER TABLE payment_order ADD INDEX idx_merchant_status (merchant_id, status); -- 覆盖索引 ALTER TABLE account_log ADD INDEX idx_account_type (account_id, log_type);6. 容灾与监控
6.1 多活部署方案
同城双活架构要点:
- 数据库主从同步延迟控制在毫秒级
- 交易路由按用户ID分片
- 跨机房调用超时设置300ms
- 定期演练机房切换
6.2 监控指标
核心监控看板指标:
- 交易成功率(>99.9%)
- 平均响应时间(<200ms)
- 渠道可用率(>99.5%)
- 系统错误率(<0.1%)
- 对账差异率(<0.01%)
告警规则配置示例:
- alert: HighFailureRate expr: rate(payment_failed_total[1m]) / rate(payment_total[1m]) > 0.05 for: 5m labels: severity: critical annotations: summary: "High payment failure rate detected"7. 实践经验总结
在实际支付系统建设中,有几个关键点需要特别注意:
资金安全永远是第一位的,所有资金操作必须:
- 双重校验(金额、账户)
- 完整审计(操作日志)
- 多人复核(大额交易)
分布式事务处理建议:
- 支付核心采用TCC模式
- 非核心业务采用最终一致性
- 明确各阶段超时时间
系统可观测性建设:
- 关键链路全日志追踪
- 资金变动流水可追溯
- 监控指标实时可视化
测试环境建设:
- 模拟各渠道返回码
- 压力测试常态化
- 故障注入演练
支付系统的演进通常遵循这样的路径:从单体架构到服务化,再到单元化部署。在这个过程中,保持核心模型的稳定性至关重要。我们设计的账户模型、交易模型应该能够支撑未来3-5年的业务发展,而渠道接入等变化较快的部分则应该保持足够的灵活性。