第3章:支付核心链路与一致性保障

章节导入:支付系统技术专家的核心能力之一是设计高可用、强一致的支付链路。本章聚焦“支付下单→扣款→异步通知→账务记账”全链路中,面试官最关注的技术选型、分布式事务方案、异常处理策略与性能平衡。
支付核心链路框架 下单与预扣 缓存+订单状态机 异步对账与回滚 TCC/SEATA 账务记账 复式记账+幂等 异常补偿 定时任务+补偿表 性能兜底 异步削峰+限流 监控与告警 全链路Trace 面试回答框架:先总链路 → 选一种场景切入 → 分阶段讲方案 → 最后说异常与监控 加分点:提及“最终一致性” vs “强一致性”的选型取舍

3.1 高频面试问答卡片

❓ 问题1:请描述一次支付下单的核心链路设计,如何保证数据一致性?

考察点链路整体认知、分布式事务方案选型、异常处理意识、幂等设计
回答框架① 拆链路:请求→预扣库存→生成订单→扣款→异步通知→记账;② 关键点:对账与补偿;③ 选型:采用TCC(Try-Confirm-Cancel)模式,用Seata管理全局事务;④ 幂等:订单号做数据库唯一键、回调去重表。
示例回答“用户下单后先Try预扣库存,订单状态置为‘处理中’;支付网关返回后Confirm更新订单、真实扣款;若超时则Cancel回滚。中间状态通过定时任务扫描补偿表做最终一致,支付回调接口使用订单号+事务ID做幂等。” (约80字)
可能追问TCC与Saga的适用场景?如何避免悬挂事务?预扣库存过期怎么处理?
避坑提醒不要只讲理论,要结合具体中间件(如Redis预扣、MQ异步通知)。避免说“完全强一致”,支付场景通常接受最终一致性。

❓ 问题2:支付回调丢失或重复通知时,怎么处理?

考察点幂等设计、回调重试机制、消息可靠性、对账兜底
回答框架① 接收方接口设计幂等(唯一键+状态机);② 重复通知:根据payment_no查询已有状态,已终态直接返回成功;③ 丢失:依赖支付平台定时轮询 + 商户主动查询接口;④ 兜底:T+1对账文件核对差异。
示例回答“我们在收款回调入口用payment_no+type做数据库唯一索引,首次插入成功,重复插入返回主键冲突则忽略。若回调丢失,定时任务每隔1分钟拉取未终态订单主动调用支付查询接口补单,并使用消息队列异步补偿。” (约90字)
可能追问唯一索引和业务主键冲突怎么区分?MQ消息丢失如何保证?
避坑提醒不要只依赖MQ的可靠性,一定要加上本地补偿表。幂等处理要提前考虑并发写冲突。

❓ 问题3:账务记账系统如何保证数据一致性?

考察点复式记账原理、流水设计、分布式事务边界、对账机制
回答框架① 采用借贷复式记账,每笔交易生成借、贷两条流水(balance_log);② 使用分布式事务+本地消息表确保写账流水与业务状态一致;③ 账务与支付模块通过事务消息解耦;④ 日终运行试算平衡脚本,校验账户余额=流水汇总。
示例回答“每笔支付成功后,账务系统接收Seata全局事务消息,写入借记流水和贷记流水,事务ID作为幂等键。日终对账扫描所有balance_log,若某笔只写了一条则触发补偿。账户余额通过快照表+流水增量更新,定期做全量校验。” (约85字)
可能追问如何处理账务流水与订单状态不一致?出现过挂账怎么排查?
避坑提醒不要只讲“用事务”,要具体到表结构设计(如流水号规则、余额快照策略)。避免说“无差错”,实际业务需接受对账发现后补数据。
💡 面试加分技巧:在回答中主动引出“补偿机制+对账”双保险,以及对“最终一致性”与“强一致性”的取舍判断(比如支付网关侧用强一致,内部记账允许秒级最终一致)。

3.2 项目案例:支付核心链路重构与一致性保障

🏗️ 项目模板

项目名称支付平台链路升级与分布式一致性改造
业务背景原有单体支付系统扣款与记账耦合,下游频繁超时导致订单状态不一。需要升级为独立支付网关+账务系统,支持百万级日订单。
规模指标日均订单 120 万笔,峰值 2000 TPS,对账差异率 ≤0.001%
技术栈Spring Boot + Seata(AT模式) + Redis + RocketMQ + MySQL(分库分表) + XXL-Job
核心难点① 分布式事务长链路性能:Seata AT模式下锁冲突严重,改为TCC+本地消息表;② 重复回调与丢单:设计幂等表+主动查单补偿;③ 账务一致性:引入balance_journal流水表,日终试算平衡。
面试高频追问Seata AT与TCC如何选择?分库后全局事务怎么处理?库存扣减与支付回滚不一致怎么解决?
可迁移话术“在支付链路中我们采用TCC模式,通过本地补偿表和定时任务实现最终一致性。关键在于合理划定事务边界——支付网关内部使用乐观锁+短事务,账务写入使用MQ异步削峰,日终对账兜底。” (约80字)
追问路径图(一致性保障) 如何保证一致性? 分布式事务方案 幂等与补偿 对账兜底 TCC vs Saga 悬挂事务 唯一键设计 丢失如何补 差异处理
⚠️ 常见误区:回答时罗列太多技术名词(如“我们用Seata+RAbbitMQ+Redis”),但不说为什么选型。面试官更想知道你的选型依据和权衡过程。另外,不要忽略“业务补偿”和“人工介入”场景,这是支付系统的现实。