天才一秒记住【狂风中文网】地址:https://www.kfzw.net
他在七楼办公室里看邮件,窗外的杭州已经全黑了,远处的灯光像一片安静的星海。
他打了个电话给老周。
老周接的时候背景噪音很大,有人在说话,键盘在敲,像是整个实验室都在运转。
“邮件我看了,什么矛盾?“
老周的声音有点哑,应该是说了一天话的缘故。
“央行的清算系统是同步的,强一致性,每一笔交易必须在帐本上实时確认了才算完成,我们的可编程逻辑层是异步的,规则执行完了通过回调通知清算系统,问题出在这两个系统对接的地方。
“
“具体呢?“
“假设一笔100块的定向消费券支付,我们的逻辑层先执行规则:检查商户是否在指定名单里,检查有效期,检查品类限制,规则执行完了,確认可以支付,通过回调通知央行的清算系统扣款,但在我们的逻辑层確认和清算系统实际扣款之间,有一个时间差,这个时间差里如果消费者的帐户发生了其他变动,比如同时发起了另一笔支付,就会出现一致性问题。
“
“两笔支付爭同一笔钱。
“
“对,双花问题,在同步系统里不存在这个问题,因为每一笔交易都是锁定了再確认的,一笔没完另一笔就排队,在异步系统里,锁定和確认之间有间隔,间隔里什么都可能发生,这个间隔越短问题越小,但完全消除不了,只要是异步的,这个间隔就一定存在。
“
“这个问题在设计阶段没有预见到?“
“预见到了。
“老周的声音比平时低,他说话的时候背景里有人在討论什么,声音模糊地传过来。
“我在架构设计阶段就知道会遇到这个问题,但当时的判断是可以通过技术手段把间隔压缩到足够小,小到在实际场景中不会被触发,理论上是对的,实际跑出来发现,压缩间隔的代价是延迟上升,间隔越小,延迟越高,两头不能兼得。
“
林彻没说话。
“方远这三天一直在想解决方案,“老周说,“他试了两种思路,第一种是在逻辑层加一个预锁定机制,规则执行前先向清算系统申请锁定这笔钱,但这样等於把异步变回了半同步,失去了异步架构的优势,第二种是在逻辑层本地维护一份余额镜像,先在镜像上扣款,再通过回调同步到清算系统,但镜像和真实帐本之间也会有延迟差,本质上是把问题往后推了一步。
“
“两种都不行?“
“第一种否了,第二种跑了一遍,延迟太高,不能用。
“
“延迟多少?“
“第一版跑出来八百多毫秒,不稳定,有时候更高。
“
800毫秒。
央行的要求是500毫秒以內。
本章未完,请点击下一章继续阅读!若浏览器显示没有新章节了,请尝试点击右上角↗️或右下角↘️的菜单,退出阅读模式即可,谢谢!