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

问题:

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

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


解决方案:

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

1,表格结构设计:

key代表所有锁定的资源id

2,如何获取锁:

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章