✅实现一个分布式锁需要考虑哪些问题?

典型回答

想要实现一个分布式锁,一般需要考虑哪些问题?一般来说应该从以下几个方面来考虑:

互斥性

一个分布式锁,最基本的要求,就是要具备互斥性,同一时间只能有一个线程获取到锁。否则就会出现并发问题。

在分布式场景中,想要实现一个分布式锁,必须要依赖一个第三方的分布式组件,比如数据库、Redis或者Zookeeper。借助自带的锁机制、单线程、互斥性等特点来实现互斥性。

避免死锁

锁的死锁问题使我们不得不考虑的。尤其在在分布式环境中,由于网络延迟、节点故障等原因,会出现死锁的概率就会更高。所以我们在设计分布式锁的时候,一般都会设置一定的超时机制和死锁检测策略。

阻塞&非阻塞

根据加锁失败后是否阻塞持续自旋加锁,分布式锁可以分为阻塞锁和非阻塞锁。一般来说非阻塞锁用的比较多。像我们常用的Redis的分布式锁就是非阻塞锁。而使用数据库悲观锁 for update实现的可能就是个阻塞锁,

这个要根据业务的具体情况来做选择和设计

可重入

一个线程,拿到锁之后,是否可以在未释放时重新获得锁。这就是可重入的特性了。可重入的锁不仅可以提升加锁效率,也能降低死锁的概率。

而且在有些业务场景中,对是否可以重入也会有一些要求。所以这个也是需要重点考量的。

锁的性能

加锁性能是很重要的,尤其是分布式锁。因为在用分布式锁的场景一般并发较高,而如果分布式锁自身的性能差的话,对业务来说也是不可接受的。所以好的性能更重要。

可靠性

一个分布式锁是否可靠,很重要,一旦他不可靠了,就可能会出现重复加锁导致并发问题。这也是为什么Redis的分布式锁从SetNX到Redisson再到RedLock的重要原因。

其他

实现一个分布式锁,除了上面这些,还有一些其他的东西需要考虑,比如实现的复杂度、易用性等,都很重要的。

原文: https://www.yuque.com/hollis666/xkm7k3/nmebtkbkpwzxrcgr