面试记录 2026-09-23
题目:跨境支付平台方案设计
难度:high
评分:⭐⭐⭐⭐☆
我的回答
由于是资金交互,所以这里边在资金扣除和资金入账以及锁定汇率这三个阶段应该是强一致的。要求必须要么都完成,要么都完都不完成,不能出现中间态。这块我推荐使用 RPC 去强一致的执行,确保同时完成或者同时都不完成。然后像基于审计追踪这些东西可以通过异步的去抛,写到本地消息表或者是消息事务消息中,去保证一个最终的一致性,并且确保这个事情最终能完成,在整个事务结束的时候。为了确保资金的完整性,在提交请求的时候,确认一个唯一的密等的链路。提交转汇请求,确认一个唯一的 ID,整个确认整个订单的执行流程。然后在每个阶段,包括确定外汇汇率、本币扣减、外币入账,这一套每个阶段记录对应的事务日志,确保单向执行,做状态机的处理,每个阶段进行对应的事务状态记录。确保不会出现同一个请求多次执行的问题。并且生成的事务状态记录也可以用来提供给审计生成做对账。由于我们在前置的时候考虑在对账流水使用异步的方式去生成,可以依据对应的消息队列信息、MQ 这些去异步的生成流水。如果流水出现问题,跟金额对不上,可以基于刚刚生成的事务状态日志去做回查对账,最终保证整个数据的强一致变更。
点评
评分:⭐⭐⭐⭐☆
优点:
- 架构分层正确:主链路(扣款/入账/锁汇率)强一致 + 副链路(审计/流水)最终一致
- 正确识别模式:强一致用同步、最终一致用本地消息表/事务消息
- 幂等设计到位:唯一 ID 贯穿全链路,防止重复执行
- 状态机处理:每个阶段记录事务状态,支持单向执行
- 对账兜底:事务状态记录 + 回查对账,作为最终防线
- MQ 异步化:审计流水通过 MQ 异步生成,不阻塞主链路
不足:
- ❌ 术语错误:"RPC 去强一致的执行"——RPC 不是分布式事务协议,应为 TCC / Seata AT / XA
- ❌ 未指定具体分布式事务模式:主链路用 TCC?Seata AT?XA?——这是方案设计的关键决策
- ❌ 未处理外部汇率服务:第三方依赖的幂等、超时、补偿怎么处理?
- ❌ 未提 TCC 三大坑(如果用 TCC):空回滚、幂等、悬挂
- ❌ 未提资金安全细节:账户冻结(冻结余额而非直接扣款)、双花防护、限额检查
- ❌ 未提审计细节:全链路追踪(trace_id)、操作流水、监管合规
- ❌ 未提延迟优化:汇率预热缓存、批量处理、异步通知
补充:
- 完整方案设计:
- 主链路(强一致):TCC 模式
- Try:冻结 A 账户本币余额 + 锁定汇率(外部服务幂等)+ 冻结 B 账户外币额度
- Confirm:真实扣款 A + 真实入账 B + 解锁汇率
- Cancel:释放冻结 + 取消汇率锁定
- 副链路(最终一致):本地消息表 / RocketMQ 事务消息
- 审计流水、监管上报、通知用户
- 外部汇率服务:
- 幂等键:基于订单 ID + 用户 ID
- 超时重试:指数退避 1s → 2s → 4s
- 缓存预热:常用汇率预加载到 Redis
- 资金安全:
- 账户级冻结:Try 时冻结余额,Confirm 时真实扣款
- 双花防护:基于账户余额 + 业务单号唯一键
- 限额检查:单笔/单日/单月限额
- 审计追踪:
- trace_id 贯穿全链路
- 操作流水表:每步操作记录操作人、时间、参数、结果
- 监管合规:交易明细、反洗钱检查
- 延迟优化:
- 汇率预热:常用汇率缓存 5-10 秒
- 批量处理:批量入账、批量审计
- 异步通知:用户通知、监管上报走 MQ
- 对账兜底:
- 日终对账:对比 TCC 状态 + 账户流水 + 汇率服务记录
- 差错账:发现不一致自动生成差错账,人工处理
完整讲解
第一部分:知识重点剖析
核心考点定位:考察分布式事务知识的融会贯通——能否把前 9 题的概念应用到真实业务场景,做完整的方案设计。
知识点拆解:
- 业务拆解(最关键)
主链路(强一致):扣款 + 锁汇率 + 入账
副链路(最终一致):审计流水 + 监管上报 + 用户通知
- 主链路必须强一致:资金不能中间态
- 副链路可最终一致:审计/通知可容忍秒级延迟
- 主链路方案:TCC 模式
- 为什么用 TCC:资金场景需要高可控性、可审计性,业务补偿可控
- Try 阶段:冻结 A 账户本币余额 + 锁定汇率(外部服务幂等)+ 冻结 B 账户外币额度
- Confirm 阶段:真实扣款 A + 真实入账 B + 解锁汇率
- Cancel 阶段:释放冻结 + 取消汇率锁定
- 三大坑:空回滚(Try 标记表)、幂等(业务单号唯一键)、悬挂(事务状态表检查)
- 副链路方案:本地消息表 / RocketMQ 事务消息
- 本地消息表:本地事务写审计记录 + 消息表,定时扫表投递
- RocketMQ 事务消息:half message + 回查,业务方代码更简洁
- 选型:业务方运维能力强 → 本地消息表;想用成熟 MQ → RocketMQ 事务消息
- 外部汇率服务处理
- 幂等键:基于订单 ID + 用户 ID,防止重复锁定汇率
- 超时重试:指数退避 1s → 2s → 4s,最多 3 次
- 缓存预热:常用汇率预加载到 Redis,TTL 5-10 秒
- 降级方案:汇率服务不可用时,使用缓存汇率 + 标记"需人工确认"
- 资金安全设计
- 账户级冻结:Try 时冻结余额(不实际扣款),Confirm 时真实扣款
- 双花防护:基于账户余额 + 业务单号唯一键,防止同一笔钱被多次使用
- 限额检查:单笔/单日/单月限额,风控前置
- 资金隔离:用户资金、平台资金、清算资金分账户管理
- 审计追踪设计
- trace_id 贯穿全链路:所有日志、流水、消息都带 trace_id
- 操作流水表:每步操作记录操作人、时间、参数、结果、状态
- 监管合规:交易明细、反洗钱检查、跨境合规
- 不可篡改:审计日志写 WORM 存储(Write Once Read Many)
- 延迟优化设计
- 汇率预热:常用汇率缓存 5-10 秒,减少外部调用
- 批量处理:批量入账、批量审计,减少事务次数
- 异步通知:用户通知、监管上报走 MQ,不阻塞主链路
- 连接池优化:数据库、RPC、MQ 连接池调优
- 对账兜底设计
- 日终对账:对比 TCC 状态 + 账户流水 + 汇率服务记录
- 实时对账:关键交易实时比对(如金额大于阈值)
- 差错账:发现不一致自动生成差错账,人工处理
- 对账系统架构:独立对账服务 + 定时任务 + 告警
第二部分:考察方向与延伸递进
考察方向:
- 深度:能否把分布式事务模式(TCC/消息)应用到真实业务
- 广度:能否覆盖业务拆解、资金安全、审计、性能、对账五个维度
- 应用:能否处理外部依赖(汇率服务)的幂等、超时、补偿
延伸递进面试题:
- "如果外部汇率服务在 Try 阶段超时,TCC 会怎么处理?"
- 要点:Try 超时后发起 Cancel(空回滚),但 Cancel 也要考虑汇率服务超时;最终靠对账系统发现"已冻结但未扣款"的状态,人工处理
- "资金安全怎么防止'双花'?"
- 要点:基于账户余额 + 业务单号唯一键;账户级冻结(Try 冻结、Confirm 扣款);风控前置检查
- "审计日志和事务状态记录的区别?"
- 要点:事务状态记录是 TCC 框架的元数据(用于恢复),审计日志是业务操作记录(用于合规);两者都需要,用途不同
第三部分:面试者参考回答(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 设计要求完整方案):
- ❌ 主链路选 2PC 不合适:跨服务/外部汇率服务无法用数据库 2PC,应选 TCC
- ❌ 未提外部汇率服务的幂等、超时、重试、降级
- ❌ 未提资金冻结、双花防护、限额检查
- ❌ 未提 TCC 三坑、trace_id、审计流水、日终对账
- ❌ 未提延迟优化(汇率缓存、批量、异步通知)
- 方案过薄,只给了两个名词,没有流程与兜底
补充:
- 主链路 TCC:Try 冻结 A 本币 + 锁汇率 + 冻结 B 外币额度;Confirm 真扣/真入账;Cancel 释放
- 外部汇率:订单号幂等 + 指数退避 + 缓存预热 + 降级人工确认
- 资金安全:冻结余额、业务单号唯一键、限额前置
- 审计:trace_id 全链路 + 操作流水 + WORM 存储
- 兜底:日终对账 + 差错账人工处理
ℹ️ 完整讲解见上方首次记录(2026-09-23)