一、业务背景
公司经营自贩机售卖业务,技术框架使用Netty技术封装的网关实现服务端、自贩机客户端长连接。首先网关注册到ZooKeeper节点上,机器也注册到对应网关的节点下面。然后消息处理程序监听网关节点其对应的Topic,然后消息处理单元通过拉取上行消息Topic处理后,然后返回处理后的消息通过下行Topic处理。网关收到下行Topic消息后通过长连接下发给工控。技术关注:网关上下线的自动发现、工控长连接与ZK节点的相互绑定、网关节点如果被误删能自动恢复提升程序的安全、降低程序轮询节点的消耗。业务关注点:能准确的判断某台机器是否在线、机器总体在线情况统计准确。 这几点我们通过ZK Watcher解决。
二、ZooKeeper Watcher使用及原理
2.1、ZK Watcher解决什么问题?
ZK Watcher主要解决节点的变化并且通知的场景需求。比如:我们改变ZK节点配置如何能让所有的集群节点都收到通知并统一生效、在集群中我们某个程序挂掉如何将其踢出集群?ZK为了实现上述机制采用订阅通知的模式处理。当程序订阅某个ZK节点,这个节点发生节点删除、内容修改、节点创建、节点子节点变更都会通知订阅的程序。
2.2、如何使用ZK Watcher?
2.3、ZK Watcher特征
2.3.1、ZK Watcher事件注册
ZK Watcher需要注册才能生效,ZK有两类事件类型分别为节点事件类型注册、客户端事件注册。
事件注册方式 | 注册事件类型 |
---|---|
zk.getData[获取数据注册] | 节点事件注册 |
zk.exists[节点是否存在注册] | |
zk.getChildren[获取子节点注册] | |
zk.ZooKeeper[zk创建连接注册] | 客户端事件注册 |
2.3.2、ZK Watcher事件类型
ZK Watcher分为节点事件类型通知、客户端状态类型通知两类。EventType主要处理节点创建、删除、节点内容变化、节点子节点变化等通知,KeeperState主要处理连接失败、连接成功、认证失败、只读连接创建、SASL身份验证、会话过期通知等。
事件类型 | 事件类型 | 事件类型 | 事件类型描述 |
---|---|---|---|
EventType[节点事件类型] | |||
EventType.NodeCreated | 节点创建通知 | ||
EventType.NodeDeleted | 节点删除通知 | ||
EventType.NodeDataChanged | 节点data数据变化通知 | ||
EventType.NodeChildrenChanged | 一个节点的子节点数据变化通知 | ||
KeeperState[客户端状态事件类型] | |||
KeeperState.Disconnected | 连接失败通知 | ||
KeeperState.NoSyncConnected | 过时,未同步连接 服务器不会产生此状态 | ||
KeeperState.SyncConnected | 连接成功通知 | ||
KeeperState.AuthFailed | 认证失败通知 | ||
KeeperState.ConnectedReadOnly | 只读连接创建通知 | ||
KeeperState.SaslAuthenticated | SASL身份验证通过通知 | ||
KeeperState.Expired | 会话过期通知 |
2.3.3、ZK Watcher事件特征
ZK Watcher事件类型有3大特征分别为一次性、客户端串行执行、轻量。
- 一次性
- 串行执行
- 轻量
2.4、ZK Watcher源码解读
2.5、ZK性能测试
三、ZK vs Redis选型
redis list、size结构