分布式锁(一)

为什么我们需要一把分布式锁?

  • 为了效率(efficiency),协调各个客户端避免做重复的工作。即使锁偶尔失效了,只是可能把某些操作多做一遍而已,不会产生其它的不良后果。比如重复发送了一封同样的 email(当然这取决于业务应用的容忍度)。
  • 为了正确性(correctness)。在任何情况下都不允许锁失效的情况发生,因为一旦发生,就可能意味着数据不一致(inconsistency),数据丢失,文件损坏,订单重复,超卖或者其它严重的问题。

###分布式锁的三个属性

  • 互斥(Mutual Exclusion),这是锁最基本的功能,同一时刻只能有一个客户端持有锁;

  • 避免死锁(Dead lock free),如果某个客户端获得锁之后花了太长时间处理,或者客户端发生了故障,锁无法释放会导致整个处理流程无法进行下去,所以要避免死锁。最常见的是通过设置一个 TTL(Time To Live,存活时间) 来避免死锁。

  • 容错(Fault tolerance),为避免单点故障,锁服务需要具有一定容错性。
    大体有两种容错方式,一种是锁服务本身是一个集群,能够自动故障切换(ZooKeeper、etcd);

    另一种是客户端向多个独立的锁服务发起请求,其中某个锁服务故障时仍然可以从其他锁服务读取到锁信息(Redlock),代价是一个客户端要获取多把锁,并且要求每台机器的时钟都是一样的,否则 TTL 会不一致,可能有的机器会提前释放锁,有的机器会太晚释放锁,导致出现问题。

常见的分布式锁实现方案

具体解决方案后续依次介绍补充完善


分布式锁(一)
http://oowatermelon.github.io/OoWaterMelonS/2022/12/03/分布式锁(一)/
作者
OoWaterMelonS Shao
发布于
2022年12月3日
许可协议