ZooKeeper服务缓存与唯一ID
优化服务发现效率和支持唯一ID生成。
服务地址列表缓存
本地缓存策略:
Java
// 消费者缓存服务列表
List<String> instances = zk.getChildren("/services/order", watcher);
cache.set(instances);
// 监听变更更新缓存
Watcher watcher = new Watcher() {
public void process(WatchedEvent event) {
if (event.getType() == EventType.NodeChildrenChanged) {
// 重新获取并更新缓存
instances = zk.getChildren(event.getPath(), this);
cache.set(instances);
}
}
};
惰性更新优势:
| 优势 | 说明 |
|---|---|
| 减少访问 | 只在变更时更新 |
| 实时性 | 变化立即推送 |
- 低开销 | 无需轮询 |
缓存读取:
Java
// 优先从缓存读取
List<String> instances = cache.get();
if (instances == null) {
// 缓存空,从ZooKeeper获取
instances = zk.getChildren("/services/order", watcher);
cache.set(instances);
}
// 选择地址调用
String address = selectInstance(instances);
负载均衡策略:
| 策略 | 说明 |
|---|---|
| 随机 | 随机选择一个实例 |
| 轮询 | 依次选择各实例 |
| 加权 | 根据权重分配 |
| 一致性哈希 | 相同请求相同实例 |
提示:缓存+Watcher监听是高效服务发现模式。
服务分组与路由
分组设计:
Java
/services/order/v1 <- 版本1分组
/services/order/v2 <- 版本2分组
/services/order/group-a <- 分组A(灰度)
路由策略:
| 策略 | 说明 |
|---|---|
| 版本路由 | 消费者指定版本访问 |
| 分组路由 | 灰度发布按分组路由 |
| 区域路由 | 按区域就近访问 |
灰度发布:
Java
1. 新版本部署到特定分组
/services/order/v2
2. 配置消费者路由规则
灰度用户 → v2分组
普通用户 → v1分组
3. 逐步放量验证
增加v2分组流量比例
路由代码:
text
// 根据路由规则选择分组
String group = routeConfig.getGroup(user);
String path = "/services/order/" + group;
List<String> instances = getInstances(path);
String address = selectInstance(instances);
分组切换:
text
完整切换流程:
1. 新版本部署到新分组
2. 灰度流量切换到新分组
3. 验证稳定后全量切换
4. 删除旧分组实例
注意:分组路由需消费者支持路由规则配置。
分布式唯一ID生成
使用顺序节点:
text
// 创建持久顺序节点
String path = zk.create(
"/ids/id-",
null,
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL
);
// 结果:/ids/id-0000000001
// 提取序号作为ID
String id = path.substring(path.lastIndexOf('-') + 1);
// ID: 0000000001
ID特点:
| 特点 | 说明 |
|---|---|
| 同父节点唯一 | 同一父节点下唯一 |
| 递增序号 | 按创建顺序递增 |
| 10位数字 | 固定10位序号 |
ID范围:
text
序号范围: 0 ~ 2147483647(约21亿)
超过范围回绕到0重新开始
优化方案:
text
方案1: 批量预生成
一次创建多个节点,缓存ID列表
方案2: 区段分配
不同应用使用不同父节点
/ids/app1/、/ids/app2/
方案3: 组合ID
序号 + 时间戳 + 应用标识
注意事项:
| 注意点 | 说明 |
|---|---|
| 范围限制 | 约21亿,需定期清理 |
| 性能瓶颈 | 高并发需批量预取 |
| 清理机制 | 已使用ID节点需清理 |
提示:顺序节点生成ID适合中低并发场景,高并发需优化。
要点总结
- 消费者缓存服务列表,Watcher监听变更时更新
- 惰性更新减少ZooKeeper访问
- 服务分组支持版本控制和灰度发布
- 分布式唯一ID使用顺序节点生成
- ID为10位数字序号,范围约21亿
- 高并发ID生成需批量预取优化
- 已使用ID节点需定期清理
📝 发现内容有误?点击此处直接编辑