今天来讲讲分布式锁,网上相关的内容有很多,但是比较分散,刚好自己刚学习完总结下,分享给大家,文章内容会比较多,我们先从思维导图中了解要讲的内容。
分布式锁是控制分布式系统之间同步访问共享资源的一种方式,通过互斥来保持一致性。
了解分布式锁之前先了解下线程锁和进程锁:
线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等
进程锁:控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁
比如Golang语言中的sync包就提供了基本的同步基元,如互斥锁
但是以上两种适合在单体架构应用,但是分布式系统中多个服务节点,多个进程分散部署在不同节点机器中,此时对于资源的竞争,上诉两种对节点本地资源的锁就无效了。
这个时候就需要分布式锁来对分布式系统多进程访问资源进行控制,因此分布式锁是为了解决分布式互斥问题!
互斥性很好理解,这也是最基本功能,就是在任意时刻,只能有一个客户端才能获取锁,不能同时有两个客户端获取到锁。
为什么会出现死锁,因为获取锁的客户端因为某些原因(如down机等)而未能释放锁,其它客户端再也无法获取到该锁,从而导致整个流程无法继续进行。
面对这种情况,当然有解决办法啦!
引入过期时间:通常情况下我们会设置一个 TTL(Time To Live,存活时间) 来避免死锁,但是这并不能完全避免。