Zookeeper 提供了四种节点类型,每种节点类型都有其特定的用途和行为。这四种节点类型分别是:持久节点(Persistent)、持久顺序节点(Persistent Sequential)、临时节点(Ephemeral)和临时顺序节点(Ephemeral Sequential)。
节点类型概述
-
持久节点(Persistent):
- 特点:节点在创建后会一直存在,直到被显式删除。
- 用途:用于存储需要长期存在的数据。
-
持久顺序节点(Persistent Sequential):
- 特点:节点在创建时会自动附加一个递增的序列号,节点会一直存在,直到被显式删除。
- 用途:用于需要唯一命名的节点,如分布式锁、队列等。
-
临时节点(Ephemeral):
- 特点:节点在创建后会与客户端会话绑定,当会话结束(如客户端断开连接)时,节点会被自动删除。
- 用途:用于存储临时数据,如临时配置、会话数据等。
-
临时顺序节点(Ephemeral Sequential):
- 特点:节点在创建时会自动附加一个递增的序列号,节点会与客户端会话绑定,当会话结束时,节点会被自动删除。
- 用途:用于需要唯一命名的临时节点,如临时队列等。
代码示例
以下代码示例展示了如何在 Zookeeper 中创建和使用这四种节点类型。
1. 添加 Maven 依赖
在 pom.xml 中添加 Zookeeper 客户端的依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.3</version>
</dependency>
2. 创建 Zookeeper 客户端
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
public class ZookeeperClient {
private static final String ZK_ADDRESS = "localhost:2181";
private static final int SESSION_TIMEOUT = 3000;
private ZooKeeper zooKeeper;
public void connect() throws Exception {
zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("Event received: " + event);
}
});
}
public void close() throws InterruptedException {
if (zooKeeper != null) {
zooKeeper.close();
}
}
public ZooKeeper getZooKeeper() {
return zooKeeper;
}
}
3. 创建不同类型的节点
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class ZookeeperNodeExample {
private static final String PERSISTENT_PATH = "/persistent_node";
private static final String PERSISTENT_SEQUENTIAL_PATH = "/persistent_sequential_node";
private static final String EPHEMERAL_PATH = "/ephemeral_node";
private static final String EPHEMERAL_SEQUENTIAL_PATH = "/ephemeral_sequential_node";
public static void main(String[] args) throws Exception {
ZookeeperClient client = new ZookeeperClient();
client.connect();
ZooKeeper zooKeeper = client.getZooKeeper();
// 创建持久节点
if (zooKeeper.exists(PERSISTENT_PATH, false) == null) {
String createdPath = zooKeeper.create(PERSISTENT_PATH, "persistent_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Created persistent node path: " + createdPath);
}
// 创建持久顺序节点
String createdPersistentSequentialPath = zooKeeper.create(PERSISTENT_SEQUENTIAL_PATH, "persistent_sequential_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println("Created persistent sequential node path: " + createdPersistentSequentialPath);
// 创建临时节点
if (zooKeeper.exists(EPHEMERAL_PATH, false) == null) {
String createdPath = zooKeeper.create(EPHEMERAL_PATH, "ephemeral_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Created ephemeral node path: " + createdPath);
}
// 创建临时顺序节点
String createdEphemeralSequentialPath = zooKeeper.create(EPHEMERAL_SEQUENTIAL_PATH, "ephemeral_sequential_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("Created ephemeral sequential node path: " + createdEphemeralSequentialPath);
client.close();
}
}
详细解释
-
持久节点(Persistent):
- 使用
CreateMode.PERSISTENT创建持久节点。 - 示例代码中创建了路径为
/persistent_node的持久节点。
- 使用
-
持久顺序节点(Persistent Sequential):
- 使用
CreateMode.PERSISTENT_SEQUENTIAL创建持久顺序节点。 - 节点名称会自动附加一个递增的序列号。
- 示例代码中创建了路径为
/persistent_sequential_node的持久顺序节点,实际创建的节点路径可能为/persistent_sequential_node0000000001。
- 使用
-
临时节点(Ephemeral):
- 使用
CreateMode.EPHEMERAL创建临时节点。 - 节点会在客户端会话结束时自动删除。
- 示例代码中创建了路径为
/ephemeral_node的临时节点。
- 使用
-
临时顺序节点(Ephemeral Sequential):
- 使用
CreateMode.EPHEMERAL_SEQUENTIAL创建临时顺序节点。 - 节点名称会自动附加一个递增的序列号,节点会在客户端会话结束时自动删除。
- 示例代码中创建了路径为
/ephemeral_sequential_node的临时顺序节点,实际创建的节点路径可能为/ephemeral_sequential_node0000000001。
- 使用
总结
Zookeeper 提供了四种节点类型,分别是持久节点、持久顺序节点、临时节点和临时顺序节点。每种节点类型都有其特定的用途和行为。通过上述代码示例,可以了解如何在 Zookeeper 中创建和使用这四种节点类型。了解这些节点类型的特性,有助于在实际应用中选择合适的节点类型来满足不同的需求。