一、前言

  前面分析了FollowerZooKeeperServer,接着分析ObserverZooKeeperServer。

二、ObserverZooKeeperServer源码分析

  2.1 类的继承关系 

public class ObserverZooKeeperServer extends LearnerZooKeeperServer {}

  说明:ObserverZooKeeperServer也继承了LearnerZooKeeperServer抽象类,角色为Observer,其请求处理链为ObserverRequestProcessor -> CommitProcessor -> FinalRequestProcessor。可能会存在SyncRequestProcessor。

  2.2 类的属性  

public class ObserverZooKeeperServer extends LearnerZooKeeperServer {
// 日志
private static final Logger LOG =
LoggerFactory.getLogger(ObserverZooKeeperServer.class); /**
* Enable since request processor for writing txnlog to disk and
* take periodic snapshot. Default is ON.
*/
// 同步处理器是否可用
private boolean syncRequestProcessorEnabled = this.self.getSyncEnabled(); /*
* Request processors
*/
// 提交请求处理器
private CommitProcessor commitProcessor;
// 同步请求处理器
private SyncRequestProcessor syncProcessor; /*
* Pending sync requests
*/
// 待同步请求队列
ConcurrentLinkedQueue<Request> pendingSyncs =
new ConcurrentLinkedQueue<Request>();
}

  说明:该类维护了提交请求处理器和同步请求处理器,同时维护一个待同步请求的队列,是否使用同步请求处理器要根据其标志而定。

  2.3 类的构造函数  

    ObserverZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self,
DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
// 父类构造函数
super(logFactory, self.tickTime, self.minSessionTimeout,
self.maxSessionTimeout, treeBuilder, zkDb, self);
LOG.info("syncEnabled =" + syncRequestProcessorEnabled);
}

  说明:其会调用父类构造函数进行初始化操作,同时可确定此时同步请求处理器是否可用。

  2.4 核心函数分析

  1. commitRequest函数  

    public void commitRequest(Request request) {
if (syncRequestProcessorEnabled) { // 同步处理器可用
// Write to txnlog and take periodic snapshot
// 使用同步处理器处理请求
syncProcessor.processRequest(request);
}
// 提交请求
commitProcessor.commit(request);
}

  说明:若同步处理器可用,则使用同步处理器进行处理(放入同步处理器的queuedRequests队列中),然后提交请求(放入提交请求处理器的committedRequests队列中)。

  2. sync函数 

    synchronized public void sync(){
if(pendingSyncs.size() ==0){ // 没有未完成的同步请求
LOG.warn("Not expecting a sync.");
return;
}
// 移除队首元素
Request r = pendingSyncs.remove();
// 提交请求
commitProcessor.commit(r);
}

  说明:若还有未完成的同步请求,则移除该请求,并且进行提交。

三、总结

  本篇博文分析了ObserverZooKeeperServer的源码,其核心也是请求处理链对于请求的处理。至此,ZooKeeper的源码分析就告一段落了,其中之分析了部分源码,还有很多的没有分析到,之后在使用过程中遇到则再进行分析,也谢谢各位园友的观看~

【Zookeeper】源码分析之服务器(五)之ObserverZooKeeperServer的更多相关文章

  1. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  2. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  3. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  4. Zookeeper 源码分析-启动

    Zookeeper 源码分析-启动 博客分类: Zookeeper   本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...

  5. 手机自动化测试:appium源码分析之bootstrap五

    手机自动化测试:appium源码分析之bootstrap五   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...

  6. 【Zookeeper】源码分析之服务器(二)

    一.前言 前面阐述了服务器的总体框架,下面来分析服务器的所有父类ZooKeeperServer. 二.ZooKeeperServer源码分析 2.1 类的继承关系 public class ZooKe ...

  7. 【Zookeeper】源码分析之服务器(二)之ZooKeeperServer

    一.前言 前面阐述了服务器的总体框架,下面来分析服务器的所有父类ZooKeeperServer. 二.ZooKeeperServer源码分析 2.1 类的继承关系 public class ZooKe ...

  8. 【Zookeeper】源码分析之服务器(四)

    一.前言 前面分析了LeaderZooKeeperServer,接着分析FollowerZooKeeperServer. 二.FollowerZooKeeperServer源码分析 2.1 类的继承关 ...

  9. 【Zookeeper】源码分析之服务器(四)之FollowerZooKeeperServer

    一.前言 前面分析了LeaderZooKeeperServer,接着分析FollowerZooKeeperServer. 二.FollowerZooKeeperServer源码分析 2.1 类的继承关 ...

随机推荐

  1. 编写带对话框界面的OCX

    编写带对话框界面的OCX步骤: 1.添加Dialog资源,切换到资源视图,将对话框的Style设置为Child,在对话框界面右击添加类,输入类名MyDlg,使得其继承与CDialogEx.(继承CDi ...

  2. Function Programming - First Class(一等公民function)

    引用外界一等公民的定义:"在JavaScript世界中函数却是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值.传参.返回,这样的函数也称之为第一级函数 ...

  3. Shell 初步学习

    Shell 概述 Shell:Linux命令解释器 脚本执行方式 chmod 755 脚本名:赋权限(调用必须显示的使用绝对路径或相对路径) bash 脚本名:通过Bash调用执行脚本 命令别名 al ...

  4. mshta 反弹shell

    kali系统准备: 复制以下ruby代码到/usr/share/metasploit-framework/modules/exploits/windows/smb/msh_shell.rb目录(要注意 ...

  5. 用Python删除本地目录下某一时间点之前创建的所有文件

    因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作.网上 这篇文章 简明扼要地整理出最常见的os方法,抄袭如下: os.l ...

  6. NOI导刊2010提高装备运输

    www.luogu.org/problem/show?pid=1794 挺裸的一题背包,算很基础. 可以运用的技巧是三维->二维(节省空间还能少敲一点代码 #include<iostrea ...

  7. SpringBoot多数据源配置

    准备环境: jdk1.8 eclipse tomcat8.0 第一步:在配置文件添加如下信息: spring.datasource.primary.url=jdbc:mysql://localhost ...

  8. python 3.6 urllib库实现天气爬取、邮件定时给妹子发送天气

    #由于每天早上要和妹子说早安,于是做个定时任务,每天早上自动爬取天气,发送天气问好邮件##涉及模块:#(1)定时任务:windows的定时任务#             配置教程链接:http://b ...

  9. JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)

    MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来 ...

  10. Windows_server_2012-r2_x64安装教程

    版本: Windows_server_2012-r2_x64 工具: VMware vSphere Client 镜像地址: http://www.xpgod.com/soft/10718.html( ...