ZooKeeper会话管理机制
会话是客户端与ZooKeeper服务器的连接纽带。
会话生命周期管理
会话创建:
Java
// 创建会话
ZooKeeper zk = new ZooKeeper(
"host1:2181,host2:2181",
30000, // sessionTimeout
watcher // 监听器
);
创建参数:
| 参数 | 说明 |
|---|---|
| connectString | 服务器地址列表 |
| sessionTimeout | 会话超时时间(毫秒) |
| watcher | 默认监听器 |
会话超时协商:
Java
客户端请求超时: 30秒
服务器配置超时范围: min=20s, max=60s
协商结果: 在范围内选择最近值
心跳检测机制:
text
客户端 → 服务器: Ping请求(间隔tickTime/2)
服务器 → 客户端: Ping响应
超时无响应 → 会话状态变化
超时失效处理:
| 超时后 | 处理 |
|---|---|
| 会话失效 | 服务器删除临时节点 |
| 客户端重连 | 需重新创建临时节点 |
| Watcher失效 | 需重新注册监听 |
临时节点清理:
text
会话失效后服务器自动:
1. 删除该会话创建的所有临时节点
2. 通知监听这些节点的客户端
3. 清理相关Watcher
注意:会话超时时间影响临时节点生命周期。
会话状态与事件
会话状态:
| 状态 | 说明 |
|---|---|
| CONNECTING | 正在连接 |
| CONNECTED | 已连接 |
| SUSPENDED | 连接断开 |
| RECONNECTED | 重连成功 |
| CLOSED | 会话关闭 |
| LOST | 会话丢失 |
状态转换流程:
text
初始 → CONNECTING → CONNECTED
↓ 心跳超时
SUSPENDED → RECONNECTED(重连成功)
↓ 重连失败或超时
LOST → CLOSED
状态监听代码:
text
Watcher watcher = new Watcher() {
public void process(WatchedEvent event) {
KeeperState state = event.getState();
switch (state) {
case SyncConnected:
// 已连接,可正常操作
case Disconnected:
// 连接断开,等待重连
case Expired:
// 会话过期,需重建客户端
}
}
};
关键事件类型:
| 事件 | 状态变化 |
|---|---|
| None | 连接状态变化 |
| NodeCreated | 节点创建 |
| NodeDeleted | 节点删除 |
| NodeDataChanged | 数据修改 |
| NodeChildrenChanged | 子节点变化 |
处理建议:
| 状态 | 处理方式 |
|---|---|
| Disconnected | 等待自动重连 |
| Expired | 重建客户端,重建临时节点 |
| AuthFailed | 检查认证信息 |
提示:会话Expired需重建客户端,不能复用旧客户端。
要点总结
- 会话创建需指定超时时间和监听器
- 心跳检测维持会话活跃
- 会话超时后临时节点自动清理
- 状态:CONNECTING、CONNECTED、SUSPENDED、LOST
- Expired状态需重建客户端
- 监听状态变化处理重连和重建
📝 发现内容有误?点击此处直接编辑