首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于ZooKeeper到底可以干怎样的事业?

作为一个有几年经验的Java软件从业者,如果还没有接触过ZooKeeper是需要深入地考虑36岁以后的生活方式的。事实上,也不要被我这句话惊到,前几天听到一句有意思的谶语:三十三上梁山,四十五下山虎,这足以说明35岁并不真的是软件从业者们的职业生涯死亡线,有可能只是职业生涯的上升拐点。既然提到ZooKeeper,那么,它到底有什么用,我们应该怎样将它铺展开来帮助我们的日常开发?我也算是一个稍微有点学问的人(不要向我扔板砖啊(^▽^)),下面我就来总结下ZooKeeper在工业软件中的使用场景。

开箱即用的名称服务/配置管理/组的成员关系型管理

名称服务和配置管理是ZooKeeper两大发力场景。这两个功能被ZooKeeper的API直接提供。基于名称服务可以实现微服务架构中的注册中心,典型的实现是Dubbo。基于配置管理当然可以实现配置中心了。

ZooKeeper直接提供的另一个功能是组的成员关系管理。组使用一个结点呈现。组的成员在组结点下创建临时结点表示。当ZooKeeper探测到组成员掉线,则会自动移除相应的临时结点。这样说可能有点绕,一句话概述就是使用ZK会自动删除失联临时结点的特性来实现动态感知服务器集群中结点的下线功能。这样描述就有使用价值了。

分布式屏障

分布式系统使用屏障来阻塞一组结点进程,直到满足一个指定的条件,然后所有进程才被运行继续往下执行。我这里就不详述实现明细了,有兴趣的可以参考我百家号的分布式并发Barrier的实现分析一文。

分布式队列

分布式队列是一个常规的数据结构。在ZooKeeper中,为了实现分布式队列,首先指定一个znode来持有队列,叫队列结点。分布式客户端可以调用create()方法来往队列结点下写数据,并指定该节点类型为临时有序结点。一个客户端想获取队列元素数据,可以调用getChildren()方法获取队列结点的孩子结点,假如孩子结点为空则等待通知,否则获取最小顺序结点中的数据,然后删除该节点。这样就实现了队列的功能。

分布式锁

全局同步的分布式锁意味着任务时候都不允许两个客户端同时持有相同的锁。你也能够使用ZooKeeper实现。首先创建一个锁结点。客户端想获取锁,需要执行如下流程

调用create()方法创建一个临时有序结点;

调用getChildren()方法获取锁结点的孩子结点,这里需要划个重点:不需要设置watch;

假如刚刚创建的临时有序结点是最小的结点,则代表成功获取锁;

否则,客户端调用exists()方法来探测比刚刚创建临时有序结点小1的结点是否存在,这里也需要划重点:需要设置watch;

假如存在,去到第2步。否则,等待通知。

释放锁就简单了,只要删除刚刚创建的临时有序结点就行了。你可不要忘了:锁的世界总是分为独占锁和共享锁的。

两阶段提交

在分布式系统中,两阶段提交是一个让所有客户端要么提交事务要么回滚事务的算法。使用ZooKeeper,你能通过创建一个事务结点作为协调者,然后每个参与者创建一个孩子结点的方式来实现两阶段提交。当协调者创建一个孩子结点,它保留内容未定义。一旦牵扯到事务中的参与者接收到来自于协调者的事务通知,参与者读每个孩子结点,并设置watch。每个参与者然后处理查询和通过写各自的结点投票提交还是回滚。一旦写完成,通知其他的参与者,一旦所有的参与者都有所有的投票,它们能够决定是否回滚还是提交事务。

这个实现中一个有意思的点是仅仅协调者决定参与者组,创建ZooKeeper结点,传播事务到相应的参与者。实际上,甚至可以通过ZooKeeper将事务写入事务结点来传播事务。

这种实现方法有两个问题。一个是消息的复杂度为O(n^2)。在一个是通过临时结点探测参与者故障是不可能的。为了使用临时结点探测参与者故障,参与者创建结点是有很有必要的。

为了解决第一个问题,在事务结点变更时,只能通知协调者,一旦协调者做出决定,就通知参与者。这种方法是可扩展的,但是是很不好的,它要求所有的通讯都经过协调者。为了解决第二个问题,你可以让协调者将事务传播到参与者,并让每个参与者创建自己的临时结点。

Leader选举

使用ZooKeeper实现Leader选举最简单的方式是使用临时有序结点来代表客户端的提案。思路是创建一个选举结点,然后在选举结点下创建临时有序的孩子结点。最小的临时有序孩子结点就是Leader。

读到这里,我知道作为一个伟大的程序员,你肯定会撸撸袖子准备大干一场,使用ZK实现一个惊天地的中间件,这里我还是劝劝你先不要盲目,因为这些功能你都能在Curator项目中找到,除了两阶段提交和开箱即用的三个场景,你只要简单的引入curator-recipes依赖就可以了,它写的肯定比你写的好。两阶段提交倒是可以自己的推敲,特别是计算钱的项目。夜已深,睡即安!这就是ZooKeeper的价值。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200401A04AQP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券