天天看点

ZooKeeper常见问题和解决方案--《我和开源的故事》使用zk创建高级结构的指南队列

这里是Developer的最后一篇,本来想参考多课网的10篇是哪几篇,结果他删除了。嘤嘤嘤。

使用zk创建高级结构的指南

    本文写的是zookeeper实现高阶函数的方法,这些只需要在客户端实现即可,无需zk支持。

    虽然zk使用异步通知,但是你依然可以用它构建同步一致性原语,比如队列和锁。因为zk规定了更新的总顺序,而且可以通过机制查看这个顺序。

    下文将试图采取最佳方案去避免轮询、定时查询或其他可能,导致“羊群效应”的操作。这样可以避免流量激增,或可伸缩性被限制。

    文章有限,提及内容不多,比如可撤销的读写优先锁就没提及。

关于错误处理的重要事项

碎碎念:为啥是在这里,因为这篇文章不是一口气写完的。心境总是在不断的变化,想自己也不是营销人才。靠自媒体赚钱这条路,好像也行不通的样子。不如,老老实实的让他回归我的笔记用途,如果能有幸帮助到有缘的你,那是我的幸运。

使用这些方法时可能会出现一些可恢复错误。例如,有部分方法使用了临时顺序节点。创造临时顺序节点的时候会有错误出现:create()在服务上成功,然后在服务器想将节点名称返回给客户端的时候崩溃。由于客户端重连时,该会话仍然有效,所以客户端很难知道节点是否创立。下面的这个会解决这个问题。

开箱即用的应用程序:名称服务、配置、组成员

名称服务和配置是zookeeper的两个主要应用,有zookeeper的api提供。

zookeeper的另一个功能是组成员关系。组由一个节点表示,其余成员可以在组节点下创建临时节点(树呀)。当zk检测到失败时,异常失败的成员节点将被自动删除。

屏障

分布式系统可以用屏障一组节点在都满足指定条件时再开始继续处理。zookeeper通过屏障节点实现

  • 1 客户端调用zk的exists(),并设置watch为true
  • 2 如果exists()返回false,则屏障已经不在,客户端可以继续
  • 3 如果exists()返回true,则屏障仍在,客户端可以等待屏障节点的watch事件
  • 4 但watch事件被触发,再次重复2 3

双重屏障

双重屏障可以同步计算的开始。进程够数开始计算,都计算完,删除节点,进程离开。

原来屏障之前有学过,那么后面的我就不赘述了。

队列

分布式队列是一种常见的数据结构。zookeeper实现分布式队列的方法:

  • 1 指定znode保存队列,即队列节点
  • 2 通过create()将内容放入队列
  • 3 放入队列的节点以

    queue-x结尾

    。由于调用create的时候序列性和临时性都设置为true所以新路径名的格式:

    path-to-queue-node/queue-X

    ,x是单调递增的数字
  • 4 客户端想移除时,调用getChildren()函数,并在节点上设置watch为true。
最近读书的时候,看到有个人的评论:盛大世界,日升月落,四季更迭。 突然就感觉,哦豁,人生在世一场修行。

优先级队列

实现优先级队列,需要做出两个改变:1,路径名以

queue-YY

结尾,

~~未完待续

继续阅读