ZooKeeper在携程的使用和场景

合集下载

zookeeper应用场景以及实现原理

zookeeper应用场景以及实现原理

Zookeeper是一个分布式的、开源的协调服务,主要用于分布式系统中的数据管理与协调,典型的应用场景包括配置信息维护、命名服务、分布式同步以及组服务等。

在分布式系统应用中,Zookeeper被广泛应用,主流的大数据组件如HDFS、HBase、Kafka等也依靠Zookeeper 做协调服务。

其具体的应用场景包括:
1. 发布订阅(配置中心):可用于动态配置信息的发布和订阅。

2. 注册中心:服务可以向Zookeeper注册自己的信息,同时可以从Zookeeper获取其他服务的信息。

3. 分布式锁:可帮助分布式系统解决并发问题。

4. Master选举:在分布式系统中,有时需要选举出一个Master进行统一调度,在这个过程中Zookeeper可以提供帮助。

5. 分布式队列:实现多个服务器之间的协同工作。

6. 分布式ID生成:在分布式系统中,生成唯一ID是一项重要任务,Zookeeper可以提供此类服务。

Zookeeper的实现原理主要包括以下几个方面:
1. 集群架构:Zookeeper运行于一个由多个服务器组成的集群之中。

2. ZNode数据模型:Zookeeper中的所有数据都存储在节点(ZNode)上,并且每个节点都可以存储数据、元数据和ACL(访问控制列表)。

3. Watcher监听机制:Zookeeper允许用户在指定节点上设置监听器,当该节点发生变化时,Zookeeper将通知所有已设置的监听器。

4. 一致性协议之ZAB:ZAB是Zookeeper的一种原子广播协议,用于确保在分布式环境中数据的一致性。

zookeeper用法

zookeeper用法

zookeeper用法ZooKeeper是一个开源的分布式应用程序的协调服务,它是一个树形目录服务,提供的功能包括配置管理、分布式锁、集群管理。

以下是ZooKeeper的使用方法:1. 启动ZooKeeper服务:可以通过执行命令sh bin/zkServer.sh start/status/stop/restart来启动、停止、查看ZooKeeper服务状态或重启ZooKeeper服务。

2. 客户端登陆:可以通过执行命令sh bin/zkCli.sh(远程登陆zkCli.sh -server IP:2181)来登录ZooKeeper客户端。

3. 命令行操作:在ZooKeeper客户端中,可以执行以下命令进行操作:* 显示根目录下、文件:ls / 使用ls命令来查看当前ZooKeeper中所包含的内容。

* 显示根目录下、文件:ls2 / 查看当前节点数据并能看到更新次数等数据。

* 创建文件,并设置初始内容:create /zk "test" 创建一个新的znode节点“ zk ”以及与它关联的字符串。

* 获取文件内容:get /zk 确认znode是否包含我们所创建的字符串。

* 修改文件内容:set /zk "zkbak" 对zk所关联的字符串进行设置。

* 删除文件:delete /zk 将刚才创建的文件删除。

4. 使用ZooKeeper的Java API:可以在Java程序中使用ZooKeeper API进行连接、操作和监控ZooKeeper服务器。

以下是使用ZooKeeper API的示例代码:```javaimport org.apache.zookeeper.*;public class ZKExample {public static void main(String[] args) throws Exception {// 创建ZooKeeper连接ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) { System.out.println("Receive watched event:" + event);}});// 获取根目录下的所有节点List<String> nodes = zk.getChildren("/", false);System.out.println("Nodes under /: " +nodes);// 获取节点数据Stat stat = zk.exists("/test", false);if (stat != null) {System.out.println("Node /test exists, data: " + new String(zk.getData("/test", false, stat), "UTF-8"));} else {System.out.println("Node /test does not exist");}// 删除节点zk.delete("/test", stat.getVersion());// 关闭ZooKeeper连接zk.close();}}```以上示例代码演示了如何连接ZooKeeper服务器,获取根目录下的所有节点和节点数据,以及删除节点和关闭连接。

请阐述zookeeper的应用场合

请阐述zookeeper的应用场合

请阐述zookeeper的应用场合ZooKeeper 是一个开源的分布式协调服务框架,主要用于解决分布式应用中一致性、可靠性和可伸缩性等问题。

它提供了一种简单而高效的方式来管理分布式应用程序中的数据、状态和配置信息。

以下是 ZooKeeper 的一些常见应用场合:1. 分布式锁:在分布式系统中,多个进程可能需要竞争访问共享资源。

ZooKeeper 可以通过创建临时节点来实现分布式锁,确保只有一个进程能够获得锁并访问共享资源。

2. 服务注册与发现:在微服务架构中,服务可以动态地注册到 ZooKeeper 节点上,并通过节点信息来发现其他服务。

这有助于实现服务的自动发现和负载均衡。

3. 配置管理:ZooKeeper 可以用于存储和管理应用程序的配置信息,如配置文件、参数等。

通过监听 ZooKeeper 节点的变化,应用程序可以及时获取最新的配置。

4. 命名服务:ZooKeeper 可以提供全局唯一的名称服务,用于给分布式系统中的资源或服务分配唯一的标识符。

5. 分布式队列:ZooKeeper 可以用于实现简单的分布式队列。

通过创建顺序节点,可以模拟队列的行为,实现任务的排队和处理。

6. leader 选举:在分布式系统中,需要选举一个主节点来负责协调和管理其他节点。

ZooKeeper 可以通过创建临时顺序节点来实现 leader 选举。

7. 数据发布/订阅:ZooKeeper 支持数据的发布/订阅模型。

客户端可以订阅感兴趣的数据节点,当数据发生变化时,ZooKeeper 会通知订阅者。

总之,ZooKeeper 在分布式系统中扮演着重要的角色,可以用于实现各种分布式协调任务,提高系统的可靠性、一致性和可伸缩性。

zk应用场景

zk应用场景

zk应用场景
Zookeeper(zk)是一个高性能的分布式协调服务,它可以用于各种分布式场景,包括但不限于以下几个方面:
1. 协调分布式应用:在分布式系统中,各个节点之间需要协调工作,Zookeeper 提供了一套原子操作,来实现分布式应用的协调和同步。

2. 统一配置管理:分布式系统中,各个节点的配置信息需要保持一致。

Zookeeper 提供了注册中心功能,可以统一管理配置信息,降低维护成本和出错概率。

3. 分布式锁:在多线程、多进程甚至多机器环境下,锁的管理非常困难。

Zookeeper 提供了分布式锁的实现,可以保证分布式环境下的数据安全性和可靠性。

4. 集群监控:Zookeeper本身就是一个分布式集群,因此它可以用来监控其它集群的状态,并根据其变化做出相应的处理。

5. 分布式队列:在分布式系统中,消息队列的使用非常广泛。

Zookeeper可以用来实现分布式队列,支持生产者、消费者模型,保证消息的可靠性和顺序性。

总之,Zookeeper可以应用于任何需要协调分布式系统的场景,是构建分布式系统的不可或缺的基础组件之一。

Zookeeper最典型的应用场景(理论+实战)

Zookeeper最典型的应用场景(理论+实战)

Zookeeper最典型的应⽤场景(理论+实战)1.前⾔之前⾃⼰写了⼀些关于Zookeeper的基础知识,Zookeeper作为⼀种协调分布式应⽤⾼性能的调度服务,实际的应⽤场景也⾮常的⼴泛,这⾥主要通过⼏个例⼦来具体的说明Zookeeper在特定场景下的使⽤⽅式(下⾯的这些功能估计consul和etcd也能实现,以后学到了再说吧)。

2.具体应⽤2.1.⼀致性配置管理我们在开发的时候,有时候需要获取⼀些公共的配置,⽐如数据库连接信息等,并且偶然可能需要更新配置。

如果我们的服务器有N多台的话,那修改起来会特别的⿇烦,并且还需要重新启动。

这⾥Zookeeper就可以很⽅便的实现类似的功能。

2.1.1.思路将公共的配置存放在Zookeeper的节点中应⽤程序可以连接到Zookeeper中并对Zookeeper中配置节点进⾏读取或者修改(对于写操作可以进⾏权限验证设置),下⾯是具体的流程图:2.1.2.事例数据库配置信息⼀致性的维护配置类:public class CommonConfig implements Serializable{// 数据库连接配置private String dbUrl;private String username;private String password;private String driverClass;public CommonConfig() {}public CommonConfig(String dbUrl, String username, String password, String driverClass) {super();this.dbUrl = dbUrl;ername = username;this.password = password;this.driverClass = driverClass;}public String getDbUrl() {return dbUrl;}public void setDbUrl(String dbUrl) {this.dbUrl = dbUrl;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getDriverClass() {return driverClass;}public void setDriverClass(String driverClass) {this.driverClass = driverClass;}@Overridepublic String toString() {return "CommonConfig:{dbUrl:" + this.dbUrl +", username:" + ername +", password:" + this.password +", driverClass:" + this.driverClass + "}";}}配置管理中⼼获取本地配置信息修改配置,并同步同步配置信息到Zookeeper服务器public class ZkConfigMng {private String nodePath = "/commConfig";private CommonConfig commonConfig;private ZkClient zkClient;public CommonConfig initConfig(CommonConfig commonConfig) {if(commonConfig == null) {monConfig = new CommonConfig("jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf-8", "root", "root", "com.mysql.jdbc.Driver");} else {monConfig = commonConfig;}return monConfig;}/*** 更新配置** @param commonConfig* @return*/public CommonConfig update(CommonConfig commonConfig) {if(commonConfig != null) {monConfig = commonConfig;}syncConfigToZookeeper();return monConfig;}public void syncConfigToZookeeper() {if(zkClient == null) {zkClient = new ZkClient("127.0.0.1:2181");}if(!zkClient.exists(nodePath)) {zkClient.createPersistent(nodePath);}zkClient.writeData(nodePath, commonConfig);}}以上是提供者,下⾯我们需要⼀个客户端获取这些配置public class ZkConfigClient implements Runnable {private String nodePath = "/commConfig";private CommonConfig commonConfig;@Overridepublic void run() {ZkClient zkClient = new ZkClient(new ZkConnection("127.0.0.1:2181", 5000));while (!zkClient.exists(nodePath)) {System.out.println("配置节点不存在!");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}// 获取节点commonConfig = (CommonConfig)zkClient.readData(nodePath);System.out.println(commonConfig.toString());zkClient.subscribeDataChanges(nodePath, new IZkDataListener() {@Overridepublic void handleDataDeleted(String dataPath) throws Exception {if(dataPath.equals(nodePath)) {System.out.println("节点:" + dataPath + "被删除了!");}}@Overridepublic void handleDataChange(String dataPath, Object data) throws Exception {if(dataPath.equals(nodePath)) {System.out.println("节点:" + dataPath + ", 数据:" + data + " - 更新");commonConfig = (CommonConfig) data;}}});}}下⾯启动Main函数配置管理服务启动public static void main(String[] args) throws InterruptedException {SpringApplication.run(ZookeeperApiDemoApplication.class, args);ZkConfigMng zkConfigMng = new ZkConfigMng();zkConfigMng.initConfig(null);zkConfigMng.syncConfigToZookeeper();TimeUnit.SECONDS.sleep(10);// 修改值zkConfigMng.update(new CommonConfig("jdbc:mysql://192.168.1.122:3306/mydata?useUnicode=true&characterEncoding=utf-8","root", "wxh", "com.mysql.jdbc.Driver"));}}客户端启动:public static void main(String[] args) throws InterruptedException {SpringApplication.run(ZookeeperApiDemoApplication.class, args);ExecutorService executorService = Executors.newFixedThreadPool(3);// 模拟多个客户端获取配置executorService.submit(new ZkConfigClient());executorService.submit(new ZkConfigClient());executorService.submit(new ZkConfigClient());}}2.2.分布式锁在我们⽇常的开发中,如果是单个进程中对共享资源的访问,我们只需要⽤synchronized或者lock就能实现互斥操作。

zookeeper使用场景

zookeeper使用场景

《zookeeper使用场景》ZooKeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架,我们可以使用它来进行分布式数据的发布与订阅。

另一方面,通过对ZooKeeper中丰富的数据节点类型进行交叉使用,配合Watcher 事件通知机制,可以非常方便地构建一系列分布式应用中都会涉及的核心功能,如数据发布/订阅、命名服务、集群管理、Master选举、分布式锁和分布式队列等。

那接下来就针对这些典型的分布式应用场景来做下介绍。

机器节点状态放在zk的一些指定节点,供各个客户端订阅使用。

系统日志(经处理后)存储,这些日志通常2-3天后清除。

应用中用到的一些配置信息集中管理,在应用启动的时候主动来获取一次,并在节点上注册一个Watcher,以后每次配置有更新,实时通知到应用,获取最新的配置信息。

业务逻辑中需要用到的一些全局变量,比如一些消息中间件的消息队列通常有个offset,这个offset存放在zk上,这样集群中每个发送者都能知道当前的发送进度。

系统中有些信息需要动态获取,并且还会存在人工手动去修改这个信息。

以前通常是暴露出接口,例如JMX接口,有了zk后,只要将这些信息存放到zk节点上即可。

这个主要是作为分布式命名服务,通过调用zk的create node api,能够很容易创建一个全局唯一的path,可以将这个path作为一个名称。

ZooKeeper中特有的watcher注册于异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。

使用方法通常是不同系统都对zk上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点内容),其中一个系统update了znode,那么另一个系统能够收到通知,并做出相应处理。

使用ZooKeeper来进行分布式通知和协调能够大大降低系统之间的耦合。

心跳检测机制:检测系统和被测系统之间并不直接关联起来,而是通过zk上某个节点关联,大大减少系统耦合。

5、ZooKeeper 典型的应用场景详解

5、ZooKeeper 典型的应用场景详解

ZooKeeper 典型的应用场景Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式,关于Zookeeper 的详细架构等内部细节可以阅读 Zookeeper 的源码下面详细介绍这些典型的应用场景,也就是 Zookeeper 到底能帮我们解决那些问题?下面将给出答案。

统一命名服务(Name Service)分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构,既对人友好又不会重复。

说到这里你可能想到了 JNDI,没错 Zookeeper 的 Name Service 与 JNDI 能够完成的功能是差不多的,它们都是将有层次的目录结构关联到一定资源上,但是 Zookeeper 的 Name Service 更加是广泛意义上的关联,也许你并不需要将名称关联到特定资源上,你可能只需要一个不会重复名称,就像数据库中产生一个唯一的数字主键一样。

Name Service 已经是 Zookeeper 内置的功能,你只要调用 Zookeeper 的 API 就能实现。

如调用 create 接口就可以很容易创建一个目录节点。

配置管理(Configuration Management)配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的 PC Server,这样非常麻烦而且容易出错。

像这样的配置信息完全可以交给 Zookeeper 来管理,将配置信息保存在Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。

zookeeper 使用场景

zookeeper 使用场景

zookeeper 使用场景
Zookeeper 是一个针对分布式应用程序的开源协调服务。

它提供了分布式应用程序的协作服务,包括配置维护、命名服务、分布式同步和分布式锁等功能。

Zookeeper 主要用于:
1. 分布式的配置管理,例如,多个节点需要共享配置文件时,可以使用 Zookeeper 实现配置文件的管理和更新,保证多个节点共享一份数据,并可快速更新和同步。

2. 命名服务,例如,多个节点需要根据名称访问同一资源时,可以使用 Zookeeper 实现统一的命名服务,使得每个节点都能够使用相同的名称访问该资源。

3. 分布式同步,例如,多个节点需要实现数据更新同步时,可以使用 Zookeeper 实现分布式的同步控制,以保证节点间数据的一致性。

4. 分布式锁,例如,多个节点需要对同一资源进行加锁时,可以使用 Zookeeper 实现分布式的锁控制,以保证节点之间对该资源的访问不会产生冲突。

综上所述,Zookeeper 可以帮助开发人员轻松实现分布式应用程序的一些关键功能,例如配置管理、同步和锁定等,从而提升应用程序的可靠性和可扩展性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 开源软件:
– – – – – HBase Solr Storm Neo4j …
• 公司
– – – – – – – Yahoo Rackspace LinkedIn Twitter Taobao Ctrip …
Zookeeper架构
� 客户端随机连接集群中任何一台 server � 集群内所有server基于Zab(ZooKeeper Atomic Broadcast)协议进 行通信 � 集群内部根据算法自动选举出一个 leader,负责向follower(其他 server)广播所有变化消息 � 集群中每个follower都和leader通信
ZooKeeper在携程的使用和场景 介绍
携程技术研发中心
Li, Bruce 2012/09/05
议程
• • • • 序 – 携程技术研发中心简介 第一部分 – Zookeeper的一般介绍 第二部分 – 在携程的应用和使用场景介绍 Q&A
携程技术研发中心
• • • • 对技术研发投入不断增大 对基础框架愈发重视 鼓励内部使用更多优秀的开源软件 同开发社区的互动将不断加强
第一部分 Zookeeper的一般介绍
Apache Zookeeper项目简介
• 自2010年10月升级成Apache Software Foundation(ASF)顶级项目 • 分布式协调服务,提供以下功能:
– 组管理服务 – 分布式配置服务 – 分布式同步服务 – 分布式命名服务
谁在使用Zookeeper
场景1:Job调度系统存在单点故障
关键组件(如JobScheduler)只有单实例运行,无HA保障
Job
Job Worker
Job Worker
Job Worker
Job Worker
schedule
SPOF Job Scheduler read Job Config DB
Master/Slave实现
exist
NodeCreated
NodeDeleted
NodeDataChanged
getData 创建Watch的 API getChildren
NodeDeleted
NodeDataChanged
NodeChildrenChanged
NodeDeleted
NodeChildrenChange d
ZooKeeper数据模型
� � � � � 基于树形结构的命名空间,与文件系统类似 节点(znode)都可以存数据,可以有子节点 节点不支持重命名 数据大小不超过1MB(可配置) 数据读写要保证完整性
ZooKeeper基本API
string create(path, data, acl, flags) delete(path, expected_version) stat set_data(path, data, expected_version) (data, stat) get_data(path, watch) stat exists(path, watch) string[] get_children(path, watch)
第二部分 ZooKeeper在携程的应用和使用 场景
携程.net ZooKeeper Stack
携程ZooKeeper应用框架层 基于.net封装,为不同用例提供 支持,如Master/Slave,Hot Standby,Sequence Generator,Distributed Locking Service,等等
ZooKeeper封装层
�为什么需要额外的封装层
• .net客户端底层不提供可靠API支持 • 出现连接的问题时很难恢复 • 直接使用极易出错
封装层的连接管理
� CONNECTION_LOSS的处理
• • • • 底层会挑选下个服务器进行重连,以自动恢复 封装层必须有重试机制,确保在重连后检查状态并正确处理 封装层的恢复策略必须区分幂等调用与非幂等调用 要特别当心创建 sequential节点调用
• • • Follower接收来自leader的所有变化消息,保存在自己内存 Follower转发来自客户端的写请求给leader 客户端的读请求会在follower端直接服务,无需转发给leader
ZAB(ZooKeeper Atomic Broadcast) 协议
� 2011年Yahoo公开了Zab协议论文 � 选举leader,只有leader才能提出决议 � 没有abort的两段式提交 � 基于状态增量的消息传输 � 高可用高性能 � 参考:/pub/3514
携程.net客户端封装层
封装成可靠API
ZooKeeper .net client (3rdparty)
把Java客户端移植到.net
第三方.net客户端
� 较成熟开源的zookeeper .net客户端
• /ewhauser/zookeeper
� � � �
能支持ZooKeeper最新的3.4.3版本 从Java的zookeeper客户端移植而来 相对于其他.net客户端实现,ewhauser代码质量较高 我们发现一些小bug,内部已经修正,正同原作者进行联 系,提交bug报告
Znode节点类型
� Sequential节点和non-sequential节点 � Ephemeral节点和persistent节点
Sequential/non-sequential节点类型
� Non-sequential节点不能有重名 � Sequential节点
• 创建时可重名 • 实际生成节点名末尾自动添加一个10位长度、左边以0填充的单调递增数 字
Zookeeper Service /
/ForeverRunningJobs
Job Worker
/Job1 / Job2 /Job3 …… /Job /Job……
Job Worker Job Worker
Create Watch
Job Scheduler (master)
Job Scheduler (slave)
只在无法做到active-active时考虑 父节点类型为persistent 子节点类型为ephemeral + sequential 客户端启动时创建子节点 序列号最小的子节点选为master,其他 子节点都是slave � 每个slave侦听序列号比它小的子节点中 最大的子节点的NodeDeleted事件 � 一旦NodeDeleted事件被触发,该slave 客户端会重新选定侦听对象,如果不存 在可侦听对象,该slave自动晋升成 master � � � � �
Zookeeper Service /
/MSGroupMembers
Master
/MR0000000023
/MR0000000024
/MR0000000025
…… /MR /MR……
Create
Client1 Client2 Client3 Client4
Watch
JoБайду номын сангаас调度系统单点故障解决方案
Job Job Worker Job Worker Job Worker Job Worker
schedule
Job Scheduler (master)
Job Scheduler (slave)
read ZooKeeper Service
Job Config DB
场景2:Forever Running Job
� 需求:
• 调度太频繁,需要把此类Job转变成Forever Running Job • 不断发心跳请求到JobWorker以监控Job运行状态,负担 较重 • 能处理以下情况:
Ephemeral/Persistent节点类型
� Ephemeral节点在客户端session结束或超时后自 动删除 � Persistent节点生命周期和session无关,只能显 式删除
ZooKeeper Session
� 客户端和server间采用长连接 � 连接建立后,server产生session ID(64位)返还 给客户端 � 客户端定期发送ping包来检查和保持和server的 连接 � 一旦session结束或超时,所有ephemeral节点会 被删除 � 客户端可根据情况设置合适的session超时时间
ZooKeeper Watches
� � � � Watch是客户端安装在server的事件侦听方法 当侦听的变化发生时,server发消息给客户端进行通知 客户端使用单线程对所有事件按顺序同步回调 触发回调条件:
• 客户端连接、断开连接 • 节点数据发生改变 • 节点本身发生变化
ZooKeeper Watches续
• Job实例意外退出 • 机器意外宕机情况
Forever Running Job的组管理实现
� JobWorker在启动forever running job实例时,先试图创建以JobId命名的 ephemeral/non-sequential的Job子节点 � 如果无法创建该子节点,说明已有同名Job实例在运行,本次实例启动中止 � 如果Job子节点创建成功,则JobScheduler侦听该节点的NodeDeleted事件 � 如果NodeDeleted事件发生, JobScheduler将能接受到通知,并重新调度启 动新Job实例
ZooKeeper Observer
� Observer不参与选举,永远是follower � Observer数量增加
• 进一步提升集群的服务能力 • 不会增加重新选举leader的开销
� 很好地支持跨数据中心,本地读、异地写
ZooKeeper陷阱
• • • • • 在客户端事件回调实现有阻塞调用 试图跟踪每个状态变化 大量watch侦听同一个znode的状态变化 客户端会有需要长时间处理的GC(garbage collection) Session超时后上层应用不进行恢复处理
相关文档
最新文档