为什么需要分布式锁
Martin Kleppmann是英国剑桥大学的分布式系统的研究员,Martin认为一般我们使用分布式锁有两个场景:
-
- 效率:使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪费资源。比如用户付了钱之后有可能不同节点会发出多封短信。
- 正确性:加分布式锁同样可以避免破坏正确性的发生,如果两个节点在同一条数据上面操作,比如多个节点机器对同一个订单操作不同的流程有可能会导致该笔订单最后状态出现错误,造成损失。[1]
分布式锁的基本要求
通常应用场景,分布式锁应具有如下要求:
1. 互斥性
本机访问时,通常通过Java的Lock接口或者synchronized关键字ReentrantLock实现对同一进程的中的资源进行上锁,使线程实现资源的互斥访问。
分布式互斥锁要求,一个资源,只能被一个节点的一个进程的一个线程获取,实现资源的互斥。
2. 高可用
如果分布式锁失效了,依赖分布式锁的服务将变得不可用。
3. 高效率
分布式锁不能太重,必须以一种高效率的方式进行访问。
4. 可重入
同一节点的同一进程的同一线程如果获取了锁之后那么也可以再次获取这个锁。这可以一定程度避免死锁的问题发生。
5. 锁失效
分布式系统是不可靠的。如果上锁的机器宕机,将会造成死锁。所以需要一种自动锁失效的机制,保证可用性,通常采用超时的方法进行。
6. 阻塞与非阻塞(可选)
和ReentrantLock一样支持lock和trylock以及tryLock(long timeOut)。
后续章节将对常见的分布式锁实现方法进行讨论。