分布式最佳实践:分布式锁
¶为什么
在传统的单体服务中,我们经常会遇到多线程对于单一资源的抢占导致的线程安全问题以及对数据库数据操作的一致性问题,如果是在单体系统中,我们可以很方便的使用编程语言提供的锁以及数据库事务来解决这些问题。
一旦单体系统转为分布式架构,那么本地事务和线程锁就无法满足跨进程的锁效果;分布式锁则是用于进程间同步访问共享资源的一种方式,通过全局共享来实现全局锁的效果,保证数据的一致性。
总的来说,在分布式系统中,当我们期望一个操作(一个请求、一个方法、一个数据库操作…)在整个系统中同一时间只能有一个线程执行,那我们就需要用到分布式锁; 抽象来看就是两个场景:
- 单一资源的数据变更:比如对共享存储数据(数据库、缓存…)进行修改,多线程的互斥
- access token:对于多个资源的原子性操作,期望整个业务逻辑就是单一线程执行保持一致性,在入口处就锁住
分布式锁应该具备的特性:
- 原子性:在分布式系统中,一个方法在同一时间只能被一个线程执行
- 阻塞性:在没获取到锁时可以进行阻塞也可以返回失败
- 高可用:能够正确的获取锁和释放锁,且具备锁失效的能力
- 高性能:获取锁与释放锁的性能保障
- 可重入:能够具备可重入特性