IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Zookeeper事件监听Watcher -> 正文阅读

[大数据]Zookeeper事件监听Watcher

关于zk的watcher

ZooKeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些事件,比如节点更新,删除,增加。触发了这个Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

Watcher机制注意点

  • zk原生提供的watcher通知是一次性的,必须重复注册
    这点可以通过Curator来改善,Curator是什么呢?我们来看看Zookeeper 的核心提交者 Patrick Hunt 对Curator的高度评价。在这里插入图片描述
    “Guava之于Java就是Curator之于Zookeeper”,我觉得这句话也很好的解释Curator是什么。Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作。其中就包括了对于注册监听操作的反复注册,也就是watcher通知后Curator能做到自动重新注册,这样就改善了watcher通知的一次性。还支持三种缓存监听,功能强大,感兴趣的小伙伴可以去了解一下。

  • 节点数据的版本变化也会触发节点数据改变的方法(NodeDataChanged)
    也就是说只要setData被执行,无论是否是set了新的值,也就是哪怕更改的内容和之前是一致的,都会触发这个wathcer

  • 一个watch对象或一个函数/上下文对,为一个事件只会被通知一次。
    比如,如果同一个watch对象在同一个文件上分别通过exists和getData注册了两次,而这个文件之后被删除了,这时这个watch对象将只会收到一次通知。即
    Watcher对象只会保存在客户端,不会传递到服务端。

  • 很重要的一点:Zookeeper不能保证每一次节点的的变化都能成功反馈给客服端。
    这是什么意思呢?其实就是一个数据库一致性的问题。我们先来分析一下原因。
    请添加图片描述
    我们来分析一下这个流程,主要是一个红色线条地方。当数据发生修改后,通知到客户端,客户端接收到数据,然后再次注册watch到zk,很明显这个流程中其实是有一个空档的。也就是说这个过程并没有watch去监听到zk节点的数据变化。如果在这个时候zk节点的数据发生了变化。那么这个修改对于客户端来说是不可见的。也就是这个数据修改客户端并没有感知和接收到。甚至在这个过程中zk的数据还可能发生了多次的修改。所以,Zookeeper并不能保证每一次节点的变化都能够通知到客户端。

谈谈Zookeeper作为配置中心

再说说一个比较冷门的微服务结构。用zk来做微服务架构的配置中心。配置中心的作用我在这就不过多做出阐述。感兴趣的同学可以去了解一下(不然后面可能有点难懂),其实引入微服务的各种概念无非就是要解决某些问题。配置中心其实就是解决了配置管理的问题。
相关依赖:

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
    </dependency>

我们先来看看官方文档对于zookeeper-config的介绍:
Zookeeper provides a hierarchical namespace that lets clients store arbitrary data, such as configuration data.Spring Cloud Zookeeper Config is an alternative to the Config Server and Client .
说人话:Zookeeper提供了一个 分层的名称空间 ,该名称空间使客户端可以存储任意数据,例如配置数据。Spring Cloud Zookeeper Config是Config Server和Client的替代方法 。
这个介绍其实已经很清晰了。我们看到最后一句zk config是一种替代方法。说明他还是有很多不足。
zk config原理分析:源码就不贴了,其实看起来也不算困难。我来口述一下吧。zk作为配置中心,他的一个原理就是zk的节点是可以存储数据的,我们可以把配置文件存在zk的节点中,然后客户端对节点注册watch监听,当然源码中用到了Curator封装的方法注册了监听,采用了缓存监听中TreeCache的方式(对于节点和子节点的数据变化都能感知到)对于存配置文件的节点注册了监听。然后zk节点上的配置文件一发生变化,客户端就能感知并接受到数据。这个过程是不是很熟悉。问题随之而来。

聪明的小伙伴们肯定马上就想到问题所在了吧。上文中提到了:Zookeeper不能保证每一次节点的的变化都能成功反馈给客服端。这样zk config的方式做配置中心就可能存在数据丢失的问题。从而导致配置文件的分发失败。

但就我个人而言,我觉得不是很庞大的系统的话,又是zk做注册中心的微服务架构的话。zk config真的非常非常非常方便和简易。其实我们想想就知道。配置中心配置文件的发布都是我们人为的一个过程。是可操控的,是由开发者指定。所以上面提到的问题其实是可以避免的。只要不接连的连续的多次更改配置文件,配置中心不快速连续多次的发布配置文件。那么zk config这种替代方案,还是非常的香的。

以上只是个人学习中一些感悟与分享,如有错误欢迎指正与交流。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 10:53:03  更:2021-08-02 10:54:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 17:20:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码