首页 > 编程知识 正文

什么是分布式金融平台,度小满分布式金融白皮书

时间:2023-05-05 08:39:07 阅读:143946 作者:485

本文前言1 .分布式锁定1.1分布式锁定1.2金融体系中的实践2 .分布式自旋锁定2.1分布式自旋锁定2.2金融体系中的实践3 .总结

前言分布式锁在当今微服务体系结构的系统中起着重要的作用,尤其是金融支付系统这种涉及钱的一致系统被广泛使用。 以下,首先介绍在实际支付系统中如何利用分布式锁定实现特殊需求。

1 .分布式锁定1.1什么是分布式锁定? 做web开发的人应该或多或少听说过,或者用过。 这里简要介绍分布式锁定的场景和实现方法。 如果需要详细的实现,请试着搜索一下。所谓分布式锁在我看来就是能让同一资源在不同机器、应用中保持互斥:

了解java的锁定机制后,实际上就是将java锁定作为交叉服务器来协调每个实例。

分布式锁实现方式有很多,如redis、zookeeper,选择主要看场景:

了解cap原则的学生应该知道分布式系统只能使用AP (可用性牺牲的强一致性(或CP )强一致性牺牲)。 这也支持redis和zookeeper这两种分布式锁定APP应用场合,但目前redis分布式锁定的应用似乎将广泛。 之所以这么说,是因为现在很多系统不能保证异步的根本强一致性,最终保证一致性。 redis锁定的效率也是

分布式锁实现原理:

其实分布式锁定的实现原理非常简单,现在我们来打个比方。 以http://www.Sina.com/Redis分布式锁为例,利用redis的SETNX接口设置key,key存在则不能锁定,key不存在则可以返回锁定

1.2如果对金融体系的实践订单有业务需求,就应该不知道订单号码,用于订单的唯一识别。 然而,如果存在部分支付需求的第三方支付机构类似于支付宝(Alipay ),则请求呼叫方上传唯一的订单号,但呼叫方的行为由第三方支付系统控制。 想象一下,如果你是支付宝(Alipay )的开发者,那么呼叫方会以相同的订单号码同时请求支付宝(Alipay )。 如果不做任何防御会怎么样呢?

http://www.Sina.com/http://www.Sina.com /

那么,如何更优雅地解决上述问题呢?

刚才的问题抽象化后,可以分为以下几个方面。 http://www.Sina.com/http://www.Sina.com /

是分散锁定有用的时候了!

做法很简单。 http://www.Sina.com/http://www.Sina.com /

如果有同学会,设置时间太短,第一个请求还没结束,又来了同样订单号码的请求怎么办?

其实问题并不是很大。 对于支付订单界面,如果无法查询第三方订单号码,直接将订单入库的时间很短,一般锁定5秒钟即可

2 .分布式自旋锁2.1分布式锁定自旋锁分布式锁定和分布式自旋锁之间的实际差异为就好比大家去占坑,发现已经有人了就走了。 自旋还是用占坑的例子来说明。 普通的分布式锁是1.由于会校验订单号是否存在,每次都会去查询数据库导致数据库压力大。 另一方面,分布式自旋锁是2.由于是并发的请求,两笔订单会分布到两台机器,可能会导致插入两笔同样的数据,这里还派生了“1.如何让同一时间的请求不每次查询数据库”的概念。 这里就是2.在不同的机器上,如果是同一个请求是不是可以直接拦截掉不走后面下单逻辑的区别。 感兴趣的人可以尝试搜索相关文章的实现方法。1.利用第三方的订单号和商户的id作为key

分散自旋锁定的难点是等待自旋。 以redis为例。 http://www.Sina.com/http://www.Sina.com /

上面两个是自旋问题,http://www.Sina.com/http://www.Sina.com /

基于以上问题,我们设计了以下方案。

1. 2.锁定的时间可以设置为几秒,这样几秒内如果同一个订单号就会被拒绝保护后面查询数据库的资源

2 .解锁记录锁定线程

的唯一标识,在请求的时候生成一个客户端的唯一id作为value放入redis缓存键值对中,释放锁的时候去判断释放锁的客户端是否是加锁的客户端,从而避免被别的客户端释放的情况。

2.2 金融系统中的实践

1.部分退费场景
一般第三方支付都一笔支付订单都会支持多笔部分退费,这样就会有一个要求就是支付订单退款的金额是不能超过支付金额的
这里可以利用分布式锁对发起退款的逻辑进行锁定和排队,修改退款记录不会被多个客户端覆盖而产生脏数据。
1.所有子订单状态都为成功后修改主订单的状态
支付系统中会涉及到一笔主订单附带多笔子订单的业务,需要所有子订单都为成功后才能去把主订单修改成成功,而如果没有任何措施,在更新完子订单时候需要去查询所有子订单是否都为成功,这里会出现脏读,引入分布式锁则可以将处理做成串行化从而保护所有子订单的状态读取一定是正确的(当然也有别的方案如:引入一个分布式计数器,子单修改成功后加一,改完以后去查一下计数器数量是否等于子订单数量,然后去更新主订单)。

3.总结

本文是自己平时工作中遇到对分布式锁和分布式自旋锁的思考和应用,其实相关原理的文章很多但是很多局限于简单的例子并没有实际参考价值,希望本文对大家实际场景的引用有所帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。