如何利用数据库实现简单的分布式锁

问题:

现在的手头的项目大多开始使用nodejs了,nodejs的单线程本质,导致大多数nodejs的项目都采用pm2等类似的进程管理工具,采用多进程的方式(也即是同时启动目标项目的多个实例),提高应用的吞吐量和cpu的利用率。但这也要求在软件设计上,尽量保持上下文无关,进程间无资源竞争关系。但是多数情况下,这个问题有不可避免,例如一些计数操作等。

市面上有很多分布式锁的应用,例如zookeeper等,但有的时候,不想因为本身不太重的需求,而引入更多的依赖。所以利用已有的软件依赖,实现分布式锁就是一个好的选择。


解决方案:

大部分项目都是需要引入数据库,所以下面简单描述一个利用数据库提供的互斥或者说锁的能力,来实现我们需要的分布式锁。以mongodb为例:

1,表格结构设计:

key代表所有锁定的资源id

2,如何获取锁:

原理很简单,就是尝试在上述表格中,插入一个代表资源id的项,因为这个id带有唯一索引,所以只能可能有一个进程写入成功,也就是获取了锁,其它的进程需要等待,但记得设置最大等待时间。操作成功后要释放锁,也就是删除之前的记录。锁也要设置最大锁定时间,避免资源无法释放。

3,如果依赖的数据库是分布式带切片的数据库,那可以单独选出一个切片,作为单独的分布式锁的实现宿主。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值