目录
一、背景
技术和业务的发展是分不开的。业务驱动技术的发展,技术反辅业务的提升。
1.1 结算交易产品介绍
1.2 为什么要做结算金额的保证
1、结算涉及到金钱,一旦金额不一致,则会导致大问题。
2、结算涉及的系统链路较长,涉及系统交互如下:
以下情况均会引起结算出错:
-
逻辑错误,如交易在错误的时机发起了结算、结算构造结算信息计算金额错误等
-
流程中断,如结算在RPC取得订单信息时超时等
-
消息重复,如发送多次消息到结算,但是消息产生了多条。会导致一次订单发起多次结算
-
消息丢失,如交易发送MQ到结算,但是消息丢失
-
消息乱序,如一个订单发起了一次正向结算,一次逆向结算,但是逆向结算消息先到,正向结算后到。
二、目标
针对以上问题,数据一致性的目标为以下三个:
-
不多发起结算
-
不少发起结算
-
不误发起结算
三、解决方法
对目标和问题进行组合,通过问题找到解决方法,得到目标、问题、方法的关系如下:
目标 |
遇到的问题 |
解决方法 |
---|---|---|
不多发起结算 |
消息重复 |
UK、状态机、乐观锁 |
消息乱序 |
状态机、乐观锁 |
|
逻辑错误 |
对账、补偿 |
|
不少发起结算 |
流程中断 |
分布式事务、重试、实时对账 |
逻辑错误 |
对账、补偿 |
|
消息丢失 |
对账 |
|
不误发起结算 |
逻辑错误 |
计算逻辑剥离+告警 对账 |
那如何选择方法来解决实际问题?