设计:
使用临时顺序znode来表示获取锁的请求,创建最小后缀数字znode的用户成功拿到锁。
上图中znode为lock,在lock底下保存锁请求,后缀数字最小的可以获得锁,成为锁的持有者。上图中有三个锁请求,从上到下人呗是后缀数字1-3,因为1是最小的,所以可以成为锁的持有者。
避免羊群效应:
把锁请求者按照后缀数字进行排队,后缀数字小的锁请求先获取锁。如果所有的锁请求者都watch锁持有者,当代表锁请求者的znode被删除后,所有的锁请求者都会被通知到,但只有一个锁请求者能够拿到锁。这就是羊群效应。
为了避免羊群效应,每一个锁请求者watch它前面的锁请求者。每次锁被释放,只会有一个锁请求者被通知。这样做还让锁的分配具有公平性,锁定的分配遵循先到先得的原则