使用场景: 秒杀类场景
分布式锁: 当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
常用实现: 关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息。例如数据库、Redis、Zookeeper
分布式锁基于zk开源实现: Apache Curator(监护)
Guava is to Java What Curator is to Zookeeper
以下zookeeper实现简介:
zxid(Zookeeper Transaction Id)
ZooKeeper 节点类型
持久节点(PERSISTENT )、临时节点(EPHEMERAL),时序节点(SEQUENTIAL )
组合:PERSISTENT、PERSISTENT_SEQUETIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL四种
注: 临时节点下面不能创建子节点;EPHEMERAL_SEQUENTIAL可实现分布式锁
ZK分布式锁算法流程
第一个客户端 /lock/lock-0000
第二个客户端 /lock/lock-0001
…
判断自己创建子节点是否为列表中序号最小的节点,是获得锁,否监听
dosomething
删除对应子节点,释放锁
优化: 避免释放锁时1000个客户端都会被唤醒(羊群效应),通知1000客户端会阻塞其他操作,最好只唤醒最小节点对应客户端
客户端在它之前的子节点设置监听事件。/lock/lock-0001监听/lock/lock-0000,/lock/lock-0002监听/lock/lock-0001等