curator有四个包,curator-client,curator-test,curator-framework,curator-recipes,其中curator-client和curator-test是最基础的,curator-framework依赖这两个包,curator-recipes又依赖curator-framework。
curator-client总共不过三多行代码,记录一下:
CuratorZookeeperClient包含一个ConnectionState,一个RetryPolicy,一个TracerDriver。如果sessionTimeout<connectionTimeout会报warning。
TracerDriver提供打点接口,DefaultTracerDriver以log.trace形式打点, TimeTrace相当于Cat的Transaction。
DefaultZookeeperFactory直接new Zookeeper,没有多余动作。
ConnectionState实现zk的Watcher接口,其中getZooKeeper时会先判断exception,exception从队列poll出来,然后checkTimeout,取sessionTimeout和connectionTimeout最大值,如果大于该值没有连上会尝试重连,如果大于等于最小值小于最大值,且有新的connectionString时尝试连接新的connectionString,否则抛出ConnectionLossException。instanceIndex代表重试连接的次数。其process方法中会调用所有parentWatchers,对于None事件还会调用checkState方法。connectionStartMs是每次状态变更的时间而不一定是连接建立时间。HandleHolder包含了zk client的使用。
HanldeHolder中关闭zk的做法是register一个dummy watcher,不知道这个会起到什么作用呢。
ensembleprovider提供了zookeeper conenction string,有start,close,getConnectionString(当前连接服务器)的接口,FixedEnsembleProvider是最简单的EnsembleProvider,ExhibitorEnsembleProvider则定时轮询Exhibitors集群获得ConnectionString,允许设置一个RetryPolicy提供查询重试,没看出其中masterExhibitors和exhibitors的区别。
Exhibitors只是个pojo,提供了backup exhibitors集群。Exhibitors是netflix开源的zk监控,备份,恢复,清理和可视化工具,有时间倒是可以看看。
RetryPolicy <- SleepingRetry <- RetryNTImes <- RetryOneTime
RetryUntilElapsed也继承自SleepingRetry,但是时间未超出时不sleep
ExponentialBackoffRetry也继承自SleepingRetry,BoundedExponentialBackoffRetry继承自ExponentBackoffRetry,但没什么特殊。
RetrySleeper无public类,其实现在RetryLoop中。
RetryLoop就是循环重试,提供了static utility:callWithRetry,shouldRetry,isRetryException(从这里看到KeeperException中会带一个code)。其takeException方法会判断是否忽略错误,进行重试,如果不能忽略错误或不允许重试则rethrow exception。
SessionRetryLoop并非继承自RetryLoop,但用法基本与RetryLoop相同,实现了Closeable接口(因此callWithRetry最后会close),包含一个RetryLoop引用。需要先调用start,监听session是否过期。支持两个mode,RETRY时对SessionFailed无条件重试,对于FAIL总是交给retryloop引用来判断。
CloseableExecutorService实现了Closeable接口,可以进行关闭,关闭时把所有future task cancel掉,CloseableScheduledExecutorService继承自该类,功能类似。
CloseableUtils提供了closeQuietly方法,吞掉close时可能的IOException,主要是因为guava v16去掉了Closeables.closeQuietly方法。
EnsurePath确保zk路径已经创建,第一次调用的时候使用RetryLoop创建dir(同步方式),后面的ensure都是NOPs(InitialHelper和doNothingHelper)。
ZKPaths提供了很多utility:fixForNamespace,getNodeFromPath,getPathAndNode,split,mkdirs,deleteChildren,getSortedChildren,makePath
InternalACLProvider只是个接口,可以对不同路径使用不同ACL
PathUtils提供了validatePath方法,顺序节点的话路径后加1 (为什么?)
ThreadUtils是线程相关utils
curator-client总共不过三多行代码,记录一下:
CuratorZookeeperClient包含一个ConnectionState,一个RetryPolicy,一个TracerDriver。如果sessionTimeout<connectionTimeout会报warning。
TracerDriver提供打点接口,DefaultTracerDriver以log.trace形式打点, TimeTrace相当于Cat的Transaction。
DefaultZookeeperFactory直接new Zookeeper,没有多余动作。
ConnectionState实现zk的Watcher接口,其中getZooKeeper时会先判断exception,exception从队列poll出来,然后checkTimeout,取sessionTimeout和connectionTimeout最大值,如果大于该值没有连上会尝试重连,如果大于等于最小值小于最大值,且有新的connectionString时尝试连接新的connectionString,否则抛出ConnectionLossException。instanceIndex代表重试连接的次数。其process方法中会调用所有parentWatchers,对于None事件还会调用checkState方法。connectionStartMs是每次状态变更的时间而不一定是连接建立时间。HandleHolder包含了zk client的使用。
HanldeHolder中关闭zk的做法是register一个dummy watcher,不知道这个会起到什么作用呢。
ensembleprovider提供了zookeeper conenction string,有start,close,getConnectionString(当前连接服务器)的接口,FixedEnsembleProvider是最简单的EnsembleProvider,ExhibitorEnsembleProvider则定时轮询Exhibitors集群获得ConnectionString,允许设置一个RetryPolicy提供查询重试,没看出其中masterExhibitors和exhibitors的区别。
Exhibitors只是个pojo,提供了backup exhibitors集群。Exhibitors是netflix开源的zk监控,备份,恢复,清理和可视化工具,有时间倒是可以看看。
RetryPolicy <- SleepingRetry <- RetryNTImes <- RetryOneTime
RetryUntilElapsed也继承自SleepingRetry,但是时间未超出时不sleep
ExponentialBackoffRetry也继承自SleepingRetry,BoundedExponentialBackoffRetry继承自ExponentBackoffRetry,但没什么特殊。
RetrySleeper无public类,其实现在RetryLoop中。
RetryLoop就是循环重试,提供了static utility:callWithRetry,shouldRetry,isRetryException(从这里看到KeeperException中会带一个code)。其takeException方法会判断是否忽略错误,进行重试,如果不能忽略错误或不允许重试则rethrow exception。
SessionRetryLoop并非继承自RetryLoop,但用法基本与RetryLoop相同,实现了Closeable接口(因此callWithRetry最后会close),包含一个RetryLoop引用。需要先调用start,监听session是否过期。支持两个mode,RETRY时对SessionFailed无条件重试,对于FAIL总是交给retryloop引用来判断。
CloseableExecutorService实现了Closeable接口,可以进行关闭,关闭时把所有future task cancel掉,CloseableScheduledExecutorService继承自该类,功能类似。
CloseableUtils提供了closeQuietly方法,吞掉close时可能的IOException,主要是因为guava v16去掉了Closeables.closeQuietly方法。
EnsurePath确保zk路径已经创建,第一次调用的时候使用RetryLoop创建dir(同步方式),后面的ensure都是NOPs(InitialHelper和doNothingHelper)。
ZKPaths提供了很多utility:fixForNamespace,getNodeFromPath,getPathAndNode,split,mkdirs,deleteChildren,getSortedChildren,makePath
InternalACLProvider只是个接口,可以对不同路径使用不同ACL
PathUtils提供了validatePath方法,顺序节点的话路径后加1 (为什么?)
ThreadUtils是线程相关utils