分布式锁的理解
锁,主要是用来解决并发情况时对共享资源的使用时互斥控制。
案例:秒杀系统中,某商品的库存只有5件,一百个用户来抢购,售完即止。那么商品的库存量就是共享变量。保证资源访问互斥,需要对每个请求锁定共享变量,请求处理完后下个请求才能处理。否则,容易出现仅有5件商品,缺有超出5个人下单购买,这将引起极大损失。
在分布式环境中,因可能是多实例多物理机部署,所以就会变成是既多线程又多进程的情况。Go语言中,使用Lock,对于单机应用可以产生效果,但是对于分布式因部署不同机器中,Lock将会失去效果。
我的理解:分布式锁,就是在多进程的情况下,一个外界工具能够控制每个进程请求共享资源时,对共享资源进行锁定,限制一次仅一个进程访问到。
现目前常见分布式锁的方案,大致有以下几种:
- 基于数据库实现分布式锁
- 基于ZooKeeper实现分布式锁
- 基于缓存实现分布式锁,如redis、etcd等
Etcd实现分布式锁
基于缓存的锁有memcached、redis、etcd三种。相比较于数据库实现分布式锁,缓存方式实现分布式锁性能会更好些。因为:
- 缓存主要存储在内存中,存取速度会更快
- 缓存支持集群部署,可以解决单点问题
etcd实现分布式锁思路
锁,仅只能被一个进程获取到的,并占用它,其他进程请求时只能等待。通过etcd的事务txn、lease租约、watch监听三个特性实现分布式锁。
1、首先,客户端初始化于etcd服务端建立连接,并以某前缀prefile_key创建全局唯一key=prefile_key/uuid1;客户端分别为自己的key创建租约Lease。
2、为了防止其他客户端等待期间,持有者的租约失效,持有者应当创建一个定时任务作为“心跳”进行续约
3、持有者将key绑定租约写入Etcd中,根据Etcd的Revision机制,写入etcd时会返回revision。
4、客户端通过前缀key获取所有的key-value列表以及对应的Revision,判断自己的key的Revision是否是最小的,如果是则表示获取到锁
5、得到锁后就可以执行业务逻辑,处理完后释放锁