Zookeeper03——Zookeeper API的增删该查与监视点详解

本文详细介绍了Zookeeper的API,包括如何使用句柄进行操作,如创建、删除、修改和查询节点。此外,还讨论了监听器机制,包括Watcher接口的实现、事件类型和单次触发的特性,以及如何设置和处理监视点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zookeeper的API
  • Zookeeper API的核心
    • Zookeeper的API围绕Zookeeper的句柄(handle) 而构建,每个API调用都需要传入这个句柄。这个句柄代表与Zookeeper之间的一个 会话
    • 如果已经建立的一个会话与Zookeeper 服务断开,会话会转移到另一台Zookeeper服务器。会话存活,句柄有效。
    • 客户端维护的句柄,对应服务端的会话。
    • 句柄关闭,Zookeeper客户端库会告知Zookeeper服务器终止这个会话。
    • 服务器发现Zookeeper客户端已经挂掉,会使这个会话无效。
  • 原生API
    • 构造函数:ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
    • connectString:包含主机名和Zookeeper服务器的端口。
    • sessionTimeout:以毫秒为单位,表示Zookeeper等待客户端通信的最长时间,之后会声明会话已死亡。
    • watcher:用于接收会话事件的一个对象,需自己创建。
      • Watcher定义为接口,需要我们自己实现一个类,初始化后传入。客户端使用Watcher接口来监控与Zookeeper之间会话的健康情况。
      • Watcher接口在下面新建一个目录来详细说明。
    • 示例
public class ZkTest implements Watcher {
    private ZooKeeper zooKeeper;
    public void process(WatchedEvent watchedEvent) {
        System.out.println(watchedEvent.getState());//SyncConnected
        System.out.println(watchedEvent.getType());//None
    }

    @Before
    public void init() throws IOException {
        zooKeeper = new ZooKeeper("127.0.0.1:2181",15*1000,this);
    }

    @Test
    public void testCreate() throws KeeperException, InterruptedException {
        zooKeeper.getChildren("/acl20190316",false);
    }
}
  • 如上示例所示,实现Watcher接口,需要实现其接口process(WatchedEvent watchedEvent) ,对于接口process,用于接收Zookeepr客户端与服务器之间发生的事件。在创建Zookeepr客户端连接时传入的Watcher实现,会用于监控客户端与服务端之间的连接状态。
    • WatchedEvent有三个重要属性
      • KeeperState keeperState:表示客户端与服务器之间的连接状态,在创建客户端时传入的Watcher实例,当客户端与服务端之间的连接状态发生改变的时候,会收到消息。该值是一个枚举类型,常用的有:Disconnected(连接断开),SyncConnected(连接成功),AuthFailed(认证失败),Expired(过期)
      • EventType eventType:在监听Znode的指定变化时使用。也是一个枚举类型。 None, NodeCreated , NodeDeleted, NodeDataChanged, NodeChildrenChanged;
      • String path:监听Znode时,发生变化的Znode节点路径。
  • Zookeeper的客户端操作,主要是增删修改查,同时都分为同步操作方法和异步操作方法。
  • 创建方法
    • 同步:String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
      • path:表示创建znode的路径。
      • data:创建节点的数据。
      • acl:创建的节点的访问权限。
      • createMode:创建Znode的模式。分为临时,临时有序,临时,持久有序。(可参见前面博客命令行操作)。
      • 返回值:为创建节点的真实路径,在临时,持久模式下,返回值等于传入参数path。如果是有序节点,会在传入参数path后拼接节点的序号。
    • 异步(推荐):void create(String path, byte[] data, List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)
      • 该方法调用后通常在create请求到达服务端之前就会立即返回。
      • 与同步方法相比多出两个参数:
        • StringCallback cb:是一个接口,创建结果的回调方法,在create请求完成之后,回被调用。
          • void processResult(int rc, String ptah, Object ctx, String name);
          • rc:返回调用结构,与KeeperException的org.apache.zookeeper.KeeperException.Code 编码对应。
          • path:我们传给create的path参数值。
          • ctx:我们传递给create的上下文参数。
          • name:创建的znode节点名称(全路径)。
        • Object ctx:调用时指定的上下文参数。
  • 删除方法
    • 同步:void delete(String path, int version)
      • path:节点全路径。
      • version:用于指定删除节点的dataVersion,如果传入值非 -1且与当前删除节点的dataVersion不一致,则删除失败,强制删除传入 -1 即可(dataVersion的作用参见前面的博客)。
    • 异步:void delete(String path, int version, VoidCallback cb, Object ctx)
      • 与同步相比多出两个参数:
        • VoidCallback cb(同步创建节点的异步方法)
        • Object ctx:调用时指定的上下文参数。
  • 修改方法
    • 同步:Stat setData(String path, byte[] data, int version)
      • path:表示修改znode的路径。
      • data:修改节点的数据。
      • version:用于指定修改节点的dataVersion,如果传入值非 -1且与当前修改节点的dataVersion不一致,则修改失败,强制修改传入 -1 即可。
      • 返回值Stat:对应信息参见https://blog.youkuaiyun.com/November22/article/details/88593270
    • 异步:setData(String path, byte[] data, int version, StatCallback cb, Object ctx)
      • StatCallback cb,对应接口方法: void processResult(int rc, String path, Object ctx, Stat stat);可对比前面的异步方法说明。
      • Object ctx:调用时指定的上下文参数。
  • 查询方法
    • 节点存在验证
      • Stat exists(String path, Watcher watcher)
        • 其中Watcher watcher参数,表示在验证存在的时候,同时监控这个节点。
      • Stat exists(String path, boolean watch)
        • boolean watch:表示是否使用默认的监听器,即创建客户端时传入的Watcher实例。
      • void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
        • 异步验证节点存在的方法。
      • void exists(String path, boolean watch, StatCallback cb, Object ctx)
    • 值获取方法
      • byte[] getData(String path, Watcher watcher, Stat stat)
        • Watcher watcher:表示对节点值变更的监听
        • Stat stat:为一个新建的Stat对象,在获取path的znode成功后,会将对应的znode的stat信息填充到我们传入的stat对象中。
      • byte[] getData(String path, boolean watch, Stat stat)
      • void getData(String path, Watcher watcher, DataCallback cb, Object ctx)
      • void getData(String path, boolean watch, DataCallback cb, Object ctx)
    • 子节点的查询
      • List getChildren(String path, Watcher watcher)
      • List getChildren(String path, boolean watch)
      • void getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
      • void getChildren(String path, boolean watch, ChildrenCallback cb, Object ctx)
      • List getChildren(String path, Watcher watcher, Stat stat)
      • List getChildren(String path, boolean watch, Stat stat)
      • 关于获取子节点的方法,可以对比其他查询的方法,主要关注设置的Watcher watcher,使用用来监听查询节点的子节点增加和删除的变化
监听器
  • 简介
    • 监听器时Zookeeper提供的对处理变化的重要机制。我们通过对指定的znode节点注册一个通知请求,在发生变化时就会收到一个单次的通知。
  • 名词说明
    • 事件:表示一个znode节点执行了更新操作。
    • 监视点:表示一个与之关联的znode节点事件类型组成的单次触发器。
    • 通知:当一个监视点被一个事件触发,就会产生一个通知,通知注册了监视点的应用客户端收到的事件报告的信息。
  • 单次触发,即监视点最多只会被触发一次。
  • 客户端设置的每个监视点与会话关联,如果会话过期,等待中的监视点将会被删除。
  • 监视点可以跨越不同的服务端的连接而保持。
    • 即当一个Zookeeper客户端与一个Zookeeper服务端的连接断开后连接到集合中的另一个服务端,客户端会发送尚未触发的监视点列表,在注册监视点时,服务端将要检查已监视的znode节点在之前注册的监视点是否已发生变化,如果znode节点已经发生变化,一个监视点的事件就会被发送给客户端,否则在新的服务端上注册监视点。
  • 单次触发事件丢失问题
    • 因为客户端在服务端的znode上设置的监视点,是单次触发的,那么必然会造成,在监视点被触发和设置新的监视点之间的时间,出现事件丢失的情况,但是实际这并不是一个问题,因为在这个时间内,客户端随时可以去获取要监视的znode的状态信息。
  • 设置监视点
    • Zookeeper的API中的所有读操作:getDatagetChildrenexists,均可以选择在读取的znode节点上设置监视点。
    • 使用监视点机制,需要实现Watcher接口类,实现其方法
      • void process(WatchedEvent var1)
    • WatchedEvent数据结构包含一下信息:
      • KeeperState keeperState:表示客户端与服务器之间的会话状态,在创建客户端时传入的Watcher实例,当客户端与服务端之间的连接状态发生改变的时候,会收到消息。该值是一个枚举类型,常用的有:Disconnected(连接断开),SyncConnected(连接成功),AuthFailed(认证失败),Expired(过期)
      • EventType eventType:事件类型。也是一个枚举类型。None, NodeCreated , NodeDeleted, NodeDataChanged, NodeChildrenChanged;
      • String path:监听Znode时,发生变化的Znode节点路径。
    • 其中事件类型:NodeCreated , NodeDeleted, NodeDataChanged只涉及单个znode节点,NodeChildrenChanged监视znode节点的子节点。None表示无事件发生,而是zookeeper的会话状态发生变化。
    • 监视点分为:数据监视点,子节点监视点
      • NodeCreated:通过exists设置一个监视点。
      • NodeDeleted:通过exists或getData调用设置监视点。
      • NodeDataChanged:通过exists或getData调用设置监视点。
      • NodeChildrenChanged:通过getChildren设置监视点。
    • 监视点的一个问题
      • 监视点一旦设置就无法移。要移除一个监视点,只有两个方法,一是触发这个监视点,二是使会话被关闭或过期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值