array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 2 ZooKeeper核心概念 - 爱码网

这是一个系列文章,归纳整理我在网易云课堂JAVA微专业学习的知识点

1 Session会话

2 ZooKeeper核心概念

  • 一个客户端连接一个会话,由ZooKeeper分配唯一会话ID;
  • 客户端已特定的时间间隔发送心跳以保持会话有效;tickTime
  • 超过会话超时时间未收到客户端的心跳,则判定客户端离线;(默认2倍tickTime)
  • 会话中的请求是按照FIFO(先进先出 first in first out)顺序执行

2 数据模型

2 ZooKeeper核心概念

2.1 层次名称空间

  • 类似Unix文件系统,以(/)为根
  • 区别:节点可以包含与之关联的数据以及子节点(既是文件也是文件夹)
  • 节点的路径总是标识为规范的、绝对的、斜杠分隔的路径

2.2 znode

  • 名称唯一,命名规范
  • 节点类型:持久、顺序、临时、临时顺序
  • 节点数据构成

2.2.1 znode命名规范

  • null字符(\u000)不能作为路径名的一部分;
  • 以下字符不能使用,因为他们不能很好的显示,或者以令人困惑的方式呈现:\u0001-\u0019和\u007F-\u009F
  • 不允许使用以下字符:\ud800-\uf8fff,\uFFF0-\uFFFF
  • “.”字符可以用作另一个名称的一部分,但是”.”和“…“不能单独用于指示路径上的节点,因为ZooKeeper不能使用相对路径。下列内容无效: /a/b/./c 或 c/a/b/…/
  • zookeeper是保留节点名

2.2.2 znode节点类型

持久节点

create /app1 666

临时节点

会话结束即删除节点

create -e /app2 888

顺序节点

create -s /aap1/cp 888 cp0000000000

create -s /app1/ aa 0000000001

  • 10位十进制序号
  • 每个父节点一个计数器
  • 计数器是带符号int(4字节)到2147483647之后将移除(导致名称<path>-2147483647
临时顺序节点

create -e -s /app1/ 888

2.2.3 znode数据构成

节点数据:存储的协调数据(状态信息、配置、位置信息等)

节点元数据(stat结构)

数据量上限: 1M,ZooKeeper是用来做协调服务的,不是用来做数据存储的

2 ZooKeeper核心概念

其中,zxid是事务ID,任何操作都是一个事务。

2.3 ZooKeeper中的时间

多种方式跟踪时间

  • zXid ZooKeeper中的每次更改操作都对应一个唯一的事务ID,称为zXid,他是一个全局有序的戳记,如果zXid1小于zXid2,则zXi1发生在zXid2之前
  • Version Numbers 版本号,对节点的每次更改都会导致该节点的版本号之一增加
  • Ticks 当使用多服务器ZooKeeper时,服务器使用“滴答“来定义事件的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间仅通过最小会话超时(滴答时间的2倍)间接公开;客户端请求连接时,会告知服务端客户端配置的滴答时间,如果clientTicks > serverTicks则使用clientTicks,如果clientTicks <= serverTicks则使用serverTicks。
  • Real time ZooKeeper除了在zNode创建和修改时将时间戳放入stat结构之外,根本不适用Real time或始终时间。

3 watch机制

客户端可以在zNodes上设置watch,监听znode的变化

3.1 两类watch

  • data watch 监听数据变更(在get命令后加增加watch=true则启动对数据的监听:get /test 1
  • child watch 监听子节点变化

3.2 出发watch事件

Create event :Enable with a call to exists

Delete event:Enable with a call to exists,getData,and getChildren

Changed event: Enable with a call to exists and getData

Child eventL Enable with a call to getChildren

3.3 Watch重要特性

  • 一次性处罚: watch处罚后即被删除,要持续监控变化,则需要持续设置watch
  • 有序性:客户端先得到watch通知,后才会看到变化结果

3.4 watch注意事项

  • watch是一次性触发器
  • 因为watch是一次性触发器,并且在获取事件和发送获取watch的新请求之间存在延迟,所以不能可靠地得到节点发生的每个改变
  • 一个watch对象只会被特定的通知触发一次。如果一个watch对象同时注册了exits、getData,当节点被删除时,删除事件对exists和getData都有效,但只会调用watch一次
  • zkClient的subject方法通过事件接收后再次设置watch实现了连续订阅的效果

4 ZooKeeper特性

  1. 顺序一致性(Sequential Consistency):保证客户端操作时按照顺序生效的
  2. 原子性(Atomicity):更新成功或失败,没有部分结果
  3. 单个系统映像:无论连接到那个服务器,客户端都将看到相同的内容
  4. 可靠性:数据的变更不会丢失,除非被客户端覆盖修改
  5. 及时性:保证系统的客户端当时读取到的数据是最新的

相关文章: