
1) 【一句话结论】采用事件驱动架构结合事务消息机制,通过消息队列实现交易、清算、风控系统数据异步同步,并设计幂等处理、指数退避重试及补偿机制,确保数据最终一致且具备容错能力。
2) 【原理/概念讲解】数据一致性保障的核心是解决多系统间数据同步的实时性与可靠性。类比银行转账:用户转账后,银行系统(交易)更新余额,同时清算系统更新流水,风控系统更新风险标记,若任一环节延迟或失败,会导致数据不一致。方案中,交易系统作为事件生产者,将交易完成事件(含交易ID、状态、时间戳)发送至高可用消息队列(如RocketMQ),并利用事务消息特性,确保消息发送成功后,消费端(清算、风控)才能提交本地事务。消息队列作为中间件,隔离系统间依赖,实现解耦。消费端处理消息后,需回执确认,若回执失败则重试,同时记录失败日志。此外,消费端通过交易ID作为唯一标识,写入本地锁或数据库标记已处理,避免重复消费(幂等性)。风控系统本地事务失败时,通过定时任务或补偿消息回滚数据,确保一致性。
3) 【对比与适用场景】
| 方案类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 同步事务(两阶段提交) | 交易系统直接调用清算、风控系统接口,确保三者同时提交 | 强一致性,但可能阻塞交易系统 | 需要强一致性的核心交易数据 | 系统间耦合度高,故障时可能阻塞 |
| 事务消息(异步) | 交易系统发送消息到队列,消费端处理并回执 | 最终一致性,异步解耦 | 多系统异步同步,高并发场景 | 需要处理消息重试、幂等性,可能存在延迟 |
4) 【示例】假设交易系统完成一笔交易(交易ID: 1001,状态: COMPLETED,金额: 1000),调用消息队列发送事务消息:
{
"transaction_id": "1001",
"status": "COMPLETED",
"amount": 1000,
"timestamp": "2024-01-01T10:00:00Z"
}
消息队列(如RocketMQ)收到消息后,开启事务,若交易系统提交成功,则通知消费端消费。清算系统消费后,执行本地事务:更新清算表(插入流水记录),并回执;若回执失败,消息队列按指数退避重试(第一次1秒,第二次2秒,第三次4秒),超时30分钟后人工介入。风控系统消费后,更新风险标记(如“正常”),并回执。若任一系统消费失败,消息队列重试多次后仍失败,记录日志,触发补偿任务(如定时任务回滚数据)。
5) 【面试口播版答案】“面试官您好,针对交易、清算、风控多系统数据同步问题,我的方案核心是通过事件驱动+事务消息+幂等处理,确保数据最终一致且容错。首先,交易系统完成交易后,将交易结果(含交易ID、状态、时间戳)发送到高可用消息队列(如RocketMQ),并开启事务消息,确保消息发送成功后,清算和风控系统消费时才能提交本地事务。清算系统消费后,更新清算流水并回执;风控系统消费后,更新风险标记并回执。若任一系统消费失败,消息队列会按指数退避重试(如第一次1秒,第二次2秒,第三次4秒),超时30分钟后人工介入。同时,消费端通过交易ID作为唯一标识,写入本地锁标记已处理,避免重复消费。风控系统本地事务失败时,通过定时任务回滚数据,确保一致性。这样既保证数据同步,又处理了系统故障和重复消费问题。”
6) 【追问清单】
7) 【常见坑/雷区】