ZooKeeper进阶学习
Watcher 机制和ACL(访问控制列表)
Watcher 机制
ZooKeeper 的 Watcher 机制是其核心特性之一,它提供了一种轻量级的事件通知机制,允许客户端可以在节点上设置 Watcher,当节点发生变化时,ZooKeeper 会通知相应的客户端。Watcher 是一次性的,意味着它们在触发后就会被移除,需要重新设置
主要特性
- 一次性触发:
- 每个 Watcher 只能触发一次,即当被监听的节点发生变化时,ZooKeeper 会通知客户端,并移除该 Watcher。
- 异步通知:
- Watcher 机制是异步的,ZooKeeper 会通过异步回调方式通知客户端。
- 客户端注册:
- 客户端可以在节点上注册 Watcher,监听节点的创建、删除、数据变化和子节点变化等事件。
- 事件类型:
- NodeCreated:节点被创建。
- NodeDeleted:节点被删除。
- NodeDataChanged:节点的数据发生变化。
- NodeChildrenChanged:节点的子节点列表发生变化。
设置和处理 Watcher
- 设置 Watcher:
- 客户端可以通过 ZooKeeper 类的方法(如 exists、getData、getChildren 等)设置 Watcher。例如:
zooKeeper.exists("/path", true);
- 处理 Watcher 回调:
客户端需要实现 Watcher 接口,处理 Watcher 事件。典型实现如下:
public class MyWatcher implements Watcher {
@Override
public void process(WatchedEvent event) {
System.out.println("Received event: " + event);
}
}
- 重新注册 Watcher:
- 由于 Watcher 是一次性的,当一个 Watcher 被触发后,如果需要继续监听该节点的变化,客户端需要重新注册 Watcher。
示例代码
- 由于 Watcher 是一次性的,当一个 Watcher 被触发后,如果需要继续监听该节点的变化,客户端需要重新注册 Watcher。
- 以下是一个使用 ZooKeeper Watcher 机制的示例代码:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
public class ZooKeeperWatcherExample {
private static ZooKeeper zooKeeper;
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
zooKeeper = new ZooKeeper("localhost:2181", 3000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getType() == Event.EventType.None) {
// Connection related event
switch (event.getState()) {
case SyncConnected:
System.out.println("Connected to ZooKeeper");
break;
case Disconnected:
System.out.println("Disconnected from ZooKeeper");
break;
case Expired:
System.out.println("Session expired");
break;
}
} else {
// Node related event
System.out.println