浅谈Zookeeper开源客户端框架Curatorjava

Curator是Netflix开源的一套ZooKeeper客户端框架.Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层,应用方在使用的时候需要自己处理很多事情,于是在它的基础上包装了一下,提供了一套更好用的客户端框架.Netflix在用ZooKeeper的过程中遇到的问题,我们也遇到了,所以开始研究一下,首先从他在github上的源码,wiki文档以及Netflix的技术blog入手.

看完官方的文档之后,发现Curator主要解决了三类问题:

1.封装ZooKeeperclient与ZooKeeperserver之间的连接处理;2.提供了一套Fluent风格的操作API;3.提供ZooKeeper各种应用场景(recipe,比如共享锁服务,集群领导选举机制)的抽象封装.

Curator列举的ZooKeeper使用过程中的几个问题

1.初始化连接的问题:在client与server之间握手建立连接的过程中,如果握手失败,执行所有的同步方法(比如create,getData等)将抛出异常2.自动恢复(failover)的问题:当client与一台server的连接丢失,并试图去连接另外一台server时,client将回到初始连接模式session过期的问题:在极端情况下,出现ZooKeepersession过期,客户端需要自己去监听该状态并重新创建ZooKeeper实例.3.对可恢复异常的处理:当在server端创建一个有序ZNode,而在将节点名返回给客户端时崩溃,此时client端抛出可恢复的异常,用户需要自己捕获这些异常并进行重试4.使用场景的问题:Zookeeper提供了一些标准的使用场景支持,但是ZooKeeper对这些功能的使用说明文档很少,而且很容易用错.在一些极端场景下如何处理,zk并没有给出详细的文档说明.比如共享锁服务,当服务器端创建临时顺序节点成功,但是在客户端接收到节点名之前挂掉了,如果不能很好的处理这种情况,将导致死锁.

Curator主要从以下几个方面降低了zk使用的复杂性:

1.重试机制:提供可插拔的重试机制,它将给捕获所有可恢复的异常配置一个重试策略,并且内部也提供了几种标准的重试策略(比如指数补偿).2.连接状态监控:Curator初始化之后会一直的对zk连接进行监听,一旦发现连接状态发生变化,将作出相应的处理.3.zk客户端实例管理:Curator对zk客户端到server集群连接进行管理.并在需要的情况,重建zk实例,保证与zk集群的可靠连接各种使用场景支持:Curator实现zk支持的大部分使用场景支持(甚至包括zk自身不支持的场景),这些实现都遵循了zk的较佳实践,并考虑了各种极端情况.

Curator通过以上的处理,让用户专注于自身的业务本身,而无需花费更多的精力在zk本身.

Curator声称的一些亮点:

日志工具

内部采用SLF4J来输出日志采用驱动器(driver)机制,允许扩展和定制日志和跟踪处理提供了一个TracerDriver接口,通过实现addTrace()和addCount()接口来集成用户自己的跟踪框架

和Curator相比,另一个ZooKeeper客户端——zkClient

文档几乎没有异常处理弱爆了(简单的抛出RuntimeException)重试处理太难用了没有提供各种使用场景的实现对ZooKeeper自带客户端(ZooKeeper类)的"抱怨":只是一个底层实现要用需要自己写大量的代码很容易误用需要自己处理连接丢失,重试等

Curator几个组成部分

Client

这是一个底层的API,应用方基本对这个可以无视,较好直接从CuratorFramework入手,主要包括三部分:

不间断连接管理连接重试处理RetryLoop(循环重试)

一种典型的用法:

RetryLoopretryLoop=client.newRetryLoop();while(retryLoop.shouldContinue()){try{//performyourwork...//it'simportanttore-gettheZKinstanceastheremayhavebeenanerrorandtheinstancewasre-createdZooKeeperzk=client.getZookeeper();retryLoop.markComplete();}catch(Exceptione){retryLoop.takeException(e);}}如果在操作过程中失败,且这种失败是可重试的,而且在允许的次数内,Curator将保证操作的最终完成.另一种使用Callable接口的重试做法:

RetryLoop.callWithRetry(client,newCallable(){@OverridepublicVoidcall()throwsException{//doyourworkhere-itwillgetretriedifneededreturnnull;}});重试策略

RetryPolicy接口只有一个方法(以前版本有两个方法):

Curator内部实现的几种重试策略:

Framework

是ZooKeeperClient更高的抽象API

自动连接管理:当ZooKeeper客户端内部出现异常,将自动进行重连或重试,该过程对外几乎完全透明

更清晰的API:简化了ZooKeeper原生的方法,事件等,提供流程的接口

CuratorFrameworkFactory类提供了两个方法,一个工厂方法newClient,一个构建方法build.使用工厂方法newClient可以创建一个默认的实例,而build构建方法可以对实例进行定制.当CuratorFramework实例构建完成,紧接着调用start()方法,在应用结束的时候,需要调用close()方法.CuratorFramework是线程安全的.在一个应用中可以共享同一个zk集群的CuratorFramework.

CuratorFrameworkAPI采用了连贯风格的接口(FluentInterface).所有的操作一律返回构建器,当所有元素加在一起之后,整个方法看起来就像一个完整的句子.比如下面的操作:

client.create().forPath("/head",newbyte[0]);client.delete().inBackground().forPath("/head");client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/head/child",newbyte[0]);client.getData().watched().inBackground().forPath("/test");方法说明:

1.create():发起一个create操作.可以组合其他方法(比如mode或background)最后以forPath()方法结尾2.delete():发起一个删除操作.可以组合其他方法(version或background)最后以forPath()方法结尾3.checkExists():发起一个检查ZNode是否存在的操作.可以组合其他方法(watch或background)最后以forPath()方法结尾4.getData():发起一个获取ZNode数据的操作.可以组合其他方法(watch,background或getstat)最后以forPath()方法结尾5.setData():发起一个设置ZNode数据的操作.可以组合其他方法(version或background)最后以forPath()方法结尾6.getChildren():发起一个获取ZNode子节点的操作.可以组合其他方法(watch,background或getstat)最后以forPath()方法结尾7.inTransaction():发起一个ZooKeeper事务.可以组合create,setData,check,和/或delete为一个操作,然后commit()提交.

通知(Notification)

UnhandledErrorListener接口用来对异常进行处理.

名称空间(Namespace)

因为一个zk集群会被多个应用共享,为了避免各个应用的zkpatch冲突,CuratorFramework内部会给每一个CuratorFramework实例分配一个namespace(可选).这样你在createZNode的时候都会自动加上这个namespace作为这个nodepath的root.使用代码如下:

CuratorFrameworkclient=CuratorFrameworkFactory.builder().namespace("MyApp")...build();…client.create().forPath("/test",data);//nodewasactuallywrittento:"/MyApp/test"Recipe

Curator实现ZooKeeper的所有recipe(除了两段提交)

选举

集群领导选举(leaderelection)

锁服务

队列(Queue)

分布式队列:采用持久顺序zknode来实现FIFO队列,如果有多个消费者,可以使用LeaderSelector来保证队列的消费者顺序分布式优先队列:优先队列的分布式版本

BlockingQueueConsumer:JDK阻塞队列的分布式版本

关卡(Barrier)

分布式关卡:一堆客户端去处理一堆任务,只有所有的客户端都执行完,所有客户端才能继续往下处理

双分布式关卡:同时开始,同时结束

计数器(Counter)

共享计数器:所有客户端监听同一个znodepath,并共享一个的integer计数值分布式AtomicLong(AtomicInteger):AtomicXxx的分布式版本,先采用乐观锁更新,若失败再采用互斥锁更新,可以配置重试策略来处理重试

工具类

PathCache

PathCache用于监听ZNode的子节点的变化,当add,update,remove子节点时将改变PathCachestate,同时返回所有子节点的data和state.

Curator中采用了PathChildrenCache类来处理PathCache,状态的变化则采用PathChildrenCacheListener来监听.

注意:当zkserver的数据发生变化,zkclient会出现不一致,这个需要通过版本号来识别这种状态的变化

TestServer

用来在测试中模拟一个本地进程内ZooKeeperServer.

TestCluster

用来在测试中模拟一个ZooKeeperServer集群

ZKPaths工具类

1.getNodeFromPath:根据给定path获取nodename.i.e."/one/two/three"->"three"

2.mkdirs:根据给定路径递归创建所有node

3.getSortedChildren:根据给定路径,返回一个按序列号排序的子节点列表

4.makePath:根据给定的path和子节点名,创建一个完整path

EnsurePath工具类

直接看例子,具体的说就是调用多次,只会执行一次创建节点操作.

EnsurePathensurePath=newEnsurePath(aFullPathToEnsure);...StringnodePath=aFullPathToEnsure+"/foo";ensurePath.ensure(zk);//firsttimesyncsandcreatesifneededzk.create(nodePath,...);...ensurePath.ensure(zk);//subsequenttimesareNOPszk.create(nodePath,...);Notification事件处理

Curator对ZooKeeper的事件Watcher进行了封装处理,然后实现了一套监听机制.提供了几个监听接口用来处理ZooKeeper连接状态的变化

当连接出现异常,将通过ConnectionStateListener接口进行监听,并进行相应的处理,这些状态变化包括:

从com.netflix.curator.framework.imps.CuratorFrameworkImpl.validateConnection(CuratorEvent)方法中我们可以知道,Curator分别将ZooKeeper的Disconnected,Expired,SyncConnected三种状态转换成上面三种状态.

THE END
1.英语词汇recipe怎么读,是什么意思,单词翻译读音固定搭配用法单词recipe 释义recipe n 1 ~ (for sth) set of instructions for preparing a food dish, including the ingredients required 烹饪法; 食谱 [attrib 作定语] recipe books, cards 烹饪书、 食谱卡片. 2 ~ for sth (fig 比喻) method of achieving sth 方法; 秘诀; 诀窍 What is your recipe for successhttp://ec.newdu.com/28116.html
2.recipient是什么意思recipient怎么读中文意思用法recipient recipient是什么意思、recipient怎么读 读音:英[r?'s?pnt] 美[r?'s?pnt] 六级考研托福雅思GRE recipient 基本解释 n. 接受者;容器;容纳者 adj. 容易接受的;感受性强的 recipient 词性变化 名词复数形式:recipientshttps://danci.gjcha.com/recipient.html
3.2024年作文感谢信格式我们所阅读的这篇有15326文字共六篇,由沈函明经心纠正之后上传!到了,读音为dào le,汉语词语,意思是到底;毕竟。出自唐·吴融《武关》。感谢收藏,希望能分享给用的到的朋友! 2024年作文感谢信格式 篇一 一.感谢信常用词汇: gratitude n.感激,感谢indebted adj.感恩的 hospitality n.友好 reciprocate v.报答 takehttps://www.fanbenw.cn/article/444655.html
4.免费下载词汇积累高考英语高频词块汇总(3)重要提醒 由于近期公众号调整了推荐策略,导致大家无法第一时间收到我们的推送。动动手指头,给“高中英语学习帮”设置一个星标吧,这样就能第一时间看到我们的推送啦! 【文末附英文精读素材电子资源下载方式】 make常用短语 1. be made up of (=consist https://mp.weixin.qq.com/s?__biz=MzI1OTcwODcwMw==&mid=2247558693&idx=4&sn=dda9629e59f07024957e3c3d7c488e16&chksm=eb2a35173a3eebd2611074cd4d644951909996012d863d08230e52867236bf5165cfb09e0236&scene=27
5.ofrecipesofthedishes.(recipe,kind)中文翻译英文意思我妈妈有很多种菜肴的食谱。(recipe,kind) 青云英语翻译 请在下面的文本框内输入文字,然后点击开始翻译按钮进行翻译,如果您看不到结果,请重新翻译! 翻译结果1翻译结果2翻译结果3翻译结果4翻译结果5 翻译结果1复制译文编辑译文朗读译文返回顶部 [object Object]http://eyu.zaixian-fanyi.com/fan_yi_4772535
6.makefile介绍—跟我一起写Makefile1.0文档recipe 该target要执行的命令(任意的shell命令)。 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说: prerequisites中如果有一个以上的文件比target文件要新的话,recipe所定义的命令就会被执行。 这就是makefile的规则,也就是https://seisman.github.io/how-to-write-makefile/introduction.html
7.OC中几种常用的设计模式以及工厂模式(Java版)一、OC中几种常用的设计模式 1.单例模式(Singleton) 在iOS开发我们经常碰到只需要某类一个实例的情况,如: ● UIApplication类提供了 +sharedAPplication方法创建和获取UIApplication单例 ● NSBundle类提供了 +mainBunle方法获取NSBundle单例 ● NSFileManager类提供了 +defaultManager方法创建和获得NSFileManager单例https://www.jianshu.com/p/526135625ed1
8.redis在windows环境变量配置redis环境搭建有几种方式Makefile:118: recipe for target 'net.o' failed make[3]: *** [net.o] Error 127 make[3]: Leaving directory '/usr/local/redis/redis-3.2.9/deps/hiredis' Makefile:46: recipe for target 'hiredis' failed make[2]: *** [hiredis] Error 2 https://blog.51cto.com/u_19261/10840636
9.乞丐模拟器NPC位置功能及任务介绍几种重要的汽车传感器原理 一、传感器概述 传感器的概念:指能感受规定的物理量,并按照一定规律转换成可用输信号的器件或装置。简单的说,传感器即使把非电量转换成电量的装置。 汽车传感器的工作条件极为恶劣,因此,传感器能否精确可靠地工作至关重要。在该领域中,理论研究及材料应用发展迅速,半导体和金属膜技术研究及材料https://m.360docs.net/doc/b25005873.html
10.半导体FAB百问知识汇总洁净工程联盟宋松在工程师借机检查机台调整RECIPE时应挂何种STATUS? 答:TEST 若是机台MONITOR异常工程师借机检查机台时应挂何种STATUS? 答:DOWN 线上发现机台异常时通知工程师时应挂何种STATUS? 答:WAIT_ENG 线上在要将机台交给工程师做PM前等待工程师的时间应挂何种STATUS? https://www.shangyexinzhi.com/article/466432.html
11.几种蔬菜改刀的方法的做法步骤图指尖阳光光光光光【几种蔬菜改刀的方法】1.黄瓜去尾;2.去头;3.中间切断;4.在黄瓜上斜下刀,不切断;5.将黄瓜坚放;6.切片;7.菱形黄瓜片;8.甜椒去尾;2.去头;10.中间切开;11.去筋;12.竖切;13.甜椒条;14.横切;15.切成条状;16.再竖切;17.甜椒粒;18.大葱留葱白;19.一切为二;20.https://www.xiachufang.com/recipe/106648735/
12.10XPBSrecipe总结今天1. PBS片剂,将几种化合物混合,一片溶解到一定容量的蒸馏水即成PBS。Invitrogen 100 tablets, price: 47 dollars. Each tablets can be used to make 100ml of 1X PBS.价格和10X PBS差不多。 2. 公司购买瓶装PBS。Invitrogen的10X PBS 500ml 31刀,1L 50刀。1X PBS 1L价格大约是27刀一瓶。 https://blog.sina.com.cn/s/blog_69b213910100viwv.html
13.amountwatermelon()2.slicerelishmixrecipe()3判断下列每组单词的划线部分有几种读音。 A. 一种 B. 两种 C. 三种 D. 四种 ( )1. add mayonnaise amount watermelon ( )2. slice relish mix recipe ( )3. bread teaspoon dream mean ( )4. amount noun countable outback ( )5. smoothie teaspoon schoolwork tooth http://www.1010jiajiao.com/czyy/shiti_id_aa8a15c6ede3c8f563a18d91cd96e963
14.00.面向对象设计模式与原则.md·段静迪/hellodesignhello-design-pattern 可复用软件设计https://gitee.com/duanjingdi/hello-design-pattern/blob/master/00.%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B8%8E%E5%8E%9F%E5%88%99.md
15.合生元益生菌有几种合生元益生菌有几种哪款好?看实拍,买好货200000条评价 合生元(BIOSTIME)老爸抽检 益生菌奶味60袋*2 特含婴儿双歧杆菌 150亿活菌呵护肠胃 200000条评价 合生元(BIOSTIME)益生菌婴幼儿滴剂8ml*2 新生儿0岁 含婴儿双歧杆菌 低敏400亿活菌 200000条评价 更多合生元益生菌有几种供您挑选 https://yp.m.jd.com/1319f9c8d9000a0b8bbd.html