← 每日面试题 学习看板

假设你要为一个跨境支付平台设计核心的“换汇与汇款”事务。该事务涉及:从用户A的本币账户扣款、调用外部汇率服务锁定汇率、在用户B的外币账户入账、记录双边账务流水。要求绝对资金安全、可审计追踪、并尽可能降低处理延迟。请选择并详细描述你的分布式事务方案。

面试题/02架构设计题/02分布式/02分布式事务/假设你要为一个跨境支付平台设计核心的“换汇与汇款”事务。该事务涉及:从用户A的本币账户扣款、调用外部汇率服务锁定汇率、在用户B的外币账户入账、记录双边账务流水。要求绝对资金安全、可审计追踪、并尽可能降低处理延迟。请选择并详细描述你的分布式事务方案。.md

面试记录 2026-09-23

题目:跨境支付平台方案设计

难度:high

评分:⭐⭐⭐⭐☆

我的回答

由于是资金交互,所以这里边在资金扣除和资金入账以及锁定汇率这三个阶段应该是强一致的。要求必须要么都完成,要么都完都不完成,不能出现中间态。这块我推荐使用 RPC 去强一致的执行,确保同时完成或者同时都不完成。然后像基于审计追踪这些东西可以通过异步的去抛,写到本地消息表或者是消息事务消息中,去保证一个最终的一致性,并且确保这个事情最终能完成,在整个事务结束的时候。为了确保资金的完整性,在提交请求的时候,确认一个唯一的密等的链路。提交转汇请求,确认一个唯一的 ID,整个确认整个订单的执行流程。然后在每个阶段,包括确定外汇汇率、本币扣减、外币入账,这一套每个阶段记录对应的事务日志,确保单向执行,做状态机的处理,每个阶段进行对应的事务状态记录。确保不会出现同一个请求多次执行的问题。并且生成的事务状态记录也可以用来提供给审计生成做对账。由于我们在前置的时候考虑在对账流水使用异步的方式去生成,可以依据对应的消息队列信息、MQ 这些去异步的生成流水。如果流水出现问题,跟金额对不上,可以基于刚刚生成的事务状态日志去做回查对账,最终保证整个数据的强一致变更。

点评

评分:⭐⭐⭐⭐☆

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察分布式事务知识的融会贯通——能否把前 9 题的概念应用到真实业务场景,做完整的方案设计。

知识点拆解:

  1. 业务拆解(最关键)
   主链路(强一致):扣款 + 锁汇率 + 入账
   副链路(最终一致):审计流水 + 监管上报 + 用户通知
  1. 主链路方案:TCC 模式
  1. 副链路方案:本地消息表 / RocketMQ 事务消息
  1. 外部汇率服务处理
  1. 资金安全设计
  1. 审计追踪设计
  1. 延迟优化设计
  1. 对账兜底设计

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. "如果外部汇率服务在 Try 阶段超时,TCC 会怎么处理?"
  1. "资金安全怎么防止'双花'?"
  1. "审计日志和事务状态记录的区别?"

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,跨境支付这种资金场景,我的方案是"主链路强一致 + 副链路最终一致 + 对账兜底"的分层设计。 业务拆解: - 主链路(强一致):扣款 A + 锁定汇率 + 入账 B,这三步必须原子性完成 - 副链路(最终一致):审计流水、监管上报、用户通知,可以容忍秒级延迟 主链路方案:TCC 模式。资金场景需要高可控性、可审计性,TCC 最适合。 - Try:冻结 A 账户本币余额(不实际扣款)+ 锁定汇率(外部服务幂等)+ 冻结 B 账户外币额度 - Confirm:真实扣款 A + 真实入账 B + 解锁汇率 - Cancel:释放冻结 + 取消汇率锁定 - 三大坑处理:空回滚(Try 标记表检查)、幂等(业务单号唯一键)、悬挂(事务状态表检查) 副链路方案:本地消息表 + RocketMQ。主事务提交时写审计记录 + 消息表,定时扫表投递到 MQ;审计流水、监管上报、用户通知都走 MQ 异步处理,不阻塞主链路。 外部汇率服务处理: - 幂等键:基于订单 ID + 用户 ID,防止重复锁定 - 超时重试:指数退避 1s → 2s → 4s,最多 3 次 - 缓存预热:常用汇率预加载到 Redis,TTL 5-10 秒 - 降级:汇率服务不可用时,使用缓存汇率 + 标记"需人工确认" 资金安全设计: - 账户级冻结:Try 时冻结余额,Confirm 时真实扣款,防止双花 - 唯一键:基于账户余额 + 业务单号,防止同一笔钱被多次使用 - 限额检查:单笔/单日/单月限额,风控前置 审计追踪: - trace_id 贯穿全链路:所有日志、流水、消息都带 trace_id - 操作流水表:每步操作记录操作人、时间、参数、结果 - 不可篡改:审计日志写 WORM 存储 延迟优化: - 汇率预热:常用汇率缓存,减少外部调用 - 批量处理:批量入账、批量审计 - 异步通知:用户通知、监管上报走 MQ 对账兜底: - 日终对账:对比 TCC 状态 + 账户流水 + 汇率服务记录 - 差错账:发现不一致自动生成差错账,人工处理 总结一句话:资金场景的核心原则是"主链路 TCC 保证强一致,副链路消息保证最终一致,对账系统兜底防错"。这也是为什么支付宝、微信支付等核心金融系统都用这种"组合拳",而不是某个单一方案。

面试记录 2026-10-19(第 2 次)

题目:跨境支付平台"换汇与汇款"事务设计

难度:high

标签:arch/distributed/transaction, distributed/transaction, difficulty/high

评分:⭐⭐☆☆☆(2/5)

练习次数:2

我的回答

由于会涉及换汇于汇款,所以在主流程上需要使用强一致性的方案,这里可以考虑使用2PC来进行扣款,锁汇率,以及入账的这个流程;

账务流水方面可以使用最终一致性方案,使用事务消息来实现,流水异步创建;

点评

优点:

不足(high 设计要求完整方案):

补充:

ℹ️ 完整讲解见上方首次记录(2026-09-23)