面试题答案
一键面试互斥性保障
- 顺序节点特性:
- 当多个客户端尝试获取锁时,Zookeeper会为每个客户端在锁节点下创建一个顺序子节点。例如,锁节点为
/lock
,客户端创建的顺序子节点可能为/lock/lock - 0000000001
,/lock/lock - 0000000002
等。 - 客户端获取锁时,先判断自己创建的顺序子节点是否是所有子节点中序号最小的。如果是,则获取到锁;否则等待。由于Zookeeper保证了顺序子节点序号的唯一性和递增性,所以同一时刻只有一个客户端创建的顺序子节点序号最小,从而保证了锁的互斥性。
- 当多个客户端尝试获取锁时,Zookeeper会为每个客户端在锁节点下创建一个顺序子节点。例如,锁节点为
- 临时节点特性:
- 临时节点的生命周期与客户端会话绑定。如果持有锁的客户端会话失效(如网络故障、客户端崩溃等),临时节点会自动被Zookeeper删除。其他等待锁的客户端会收到节点变化通知,重新判断是否可以获取锁,这也间接保证了锁在客户端异常情况下的互斥性,因为失效客户端持有的锁会被释放。
安全性保障
- 顺序节点特性:
- 顺序节点的创建和序号分配是由Zookeeper集群按照严格的顺序进行的,这是基于Zookeeper的原子广播协议(如ZAB协议)实现的。该协议保证了集群中所有节点对顺序节点创建操作的一致性视图,从而确保了锁获取和释放过程中顺序判断的准确性,不会出现不同节点对顺序有不同认知的情况,保障了锁的安全性。
- 临时节点特性:
- 临时节点依赖客户端会话存活,Zookeeper对会话的管理是可靠的。会话的创建、维持和失效都有明确的机制,并且在集群中各节点同步。这保证了临时节点状态的一致性,不会出现某个节点认为临时节点存在,而其他节点认为其已删除的情况,保障了锁的安全性。
锁释放机制
- 临时节点特性:
- 当持有锁的客户端主动释放锁(如正常业务逻辑完成后),客户端会向Zookeeper发送删除其创建的临时顺序子节点的请求,Zookeeper会删除该节点。
- 若客户端出现异常(如崩溃、网络分区等)导致会话失效,Zookeeper会自动删除该客户端创建的临时顺序子节点。这两种情况都会触发Zookeeper的节点变更通知,通知其他等待锁的客户端重新竞争锁。
- 顺序节点特性辅助锁释放:
- 当一个客户端释放锁(删除其创建的顺序子节点)后,Zookeeper会通知序号紧随其后的客户端。该客户端收到通知后,判断自己是否成为当前序号最小的子节点,如果是,则获取锁,实现了锁的顺利交接和释放后重新分配。