zookeeperclient代码解读
近期一直在忙WebPageTest(下面简称wpt)开源库的改动工作,当中一项工作须要将zookeeper(下面简称zk)集成到wpt里。
zk作为分布式系统的同步工具。实现了写的原子性(要么失败。要么成功,并不存在写一半的情况),并通过“选举组长“和”重选组长“,在负载均衡的同一时候保证数据一致性。关于zk服务端的设计,能够參考官网http://zookeeper.apache.org/。
本文阐述zkclient的实现,一来能够梳理下思路,二来也可作为阅读笔记。
zkclient代码比較少。全然採用C语言来实现。包含:
1、hashtable的实现
hashtable的实现。包含hashtable.h。hashtable.c,hashtable_itr.h和hashtable_itr.c。从代码中能够看到,hashtable的方式基本是依照JAVA中的hash表实现的。进一步讲,hash表的内部实现事实上非常easy,如图所看到的:
hashtable内部保存了多个链表(数量可变。当当前节点数超过指定负载时添加)。元素插入。改动,删除时都以hash key为唯一主键,换言之最重要的就是保证hash key的唯一性。元素插入时,hashtable依据key计算出index。并依据index选择将元素插入第几个链表。比方:假设key计算出index为1,那么元素就被插入到list2中;假设当前负载超过最大额度。hashtable自己主动扩展链表数并对各个链表中的节点又一次hash。
hashtable_itr.h和hashtable_itr.c是hashtable的迭代器,实际上是直接对hashtable中的某个链表进行迭代。
2、序列化和反序列化
zk自己实现了序列化,整体而言,zk传输的网络数据都是:包长度(网络大端形式)+包内容。oarchive结构体和iarchive分别包括序列化和反序列化的函数指针,这些函数指针包括最主要的操作,如(反)序列化int,long。字符串(vector,buffer,String)。
详细协议包头数据(zookeeper.jute.h和zookeeper.jute.c)。则依据详细数据类型。调用各个基本函数指针完毕。
3、winconfig.h
这里须要单独讲一下winconfig.h。在讲zk继承到wpt时,我发现编译报错HMONITOR__
type redefinition。进一步排查发现与原来是这个文件定义的类型和wpt中相冲突,在各个宏定义之前加上#ifndef推断之后,编译成功。
4、核心实现
核心实现中_zhandle封装zkclient的全部数据,包含zk_adaptor.h,mt_adaptor.c
1)IO线程。
IO线程负责socket的接收或发送。发送时数据被写入到to_send链表。zk随后通过select或poll完毕。
假设是异步任务(须要回调),则同一时候创建回调并将回调数据增加到sent_requests链表。由于zk服务端保证了任务的有序性(顺序请求一定也是顺序返回)。所以当zk服务端任务结果到来,IO线程将任务结果写入to_process链表中。那么to_process中的结果和sent_requests中的回调就是相应的。
同步调用和异步调用流程一致,不同的是同步调用没有回调函数(实际上回调函数被指定为SYNCHRONOUS_MARKER),该标识会导致Complete线程做特殊处理。由于异步流程是没有等待的,所以同步时函数进入等待状态(等待任务标记完毕)。
接下来就非常easy了:zk将二者统一发送给Complete线程去处理。我想zk通过顺序来确定回调,应该是为了避免在发送数据中记录回调的信息。
2)Complete线程。Complete线程非常easy,就是IO线程的消费者:调用回调函数。
假设回调函数为SYNCHRONOUS_MARKER。则Complete通知等待线程任务完毕。
zookeeperclient代码解读的更多相关文章
- Android MVP模式 谷歌官方代码解读
Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...
- 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案
简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...
- SoftmaxLayer and SoftmaxwithLossLayer 代码解读
SoftmaxLayer and SoftmaxwithLossLayer 代码解读 Wang Xiao 先来看看 SoftmaxWithLoss 在prototext文件中的定义: layer { ...
- Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备
本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...
- Jsoup代码解读之六-防御XSS攻击
Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...
- Jsoup代码解读之五-实现一个CSS Selector
Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张s ...
- Jsoup代码解读之四-parser
Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...
- Jsoup代码解读之三-Document的输出
Jsoup代码解读之三-Document的输出 Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前 ...
- Jsoup代码解读之一-概述
Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学 ...
随机推荐
- 汇编代码中db,dw,dd的区别
db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1 dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2 dd定义双字类型变量,一个双字数据占4个字节单元,读完一个, ...
- java后台接收json数据,报错com.alibaba.fastjson.JSONObject cannot be cast to xxx
从前台接收json封装的list数据,在后台接收时一直报错,com.alibaba.fastjson.JSONObject cannot be cast to xxx, 使用这种方式接收可以接收 @R ...
- PYQT窗口风格
setWindowFlags(Qt.WindowFlags)函数,Qt.WindowFlags类如下: 1.窗口类型 Qt.Qt.Widget#插件默认窗口,有最小化.最大化.关闭按钮 Qt.Qt.W ...
- python实现并查集
并查集是这样的数据结构:有一大堆的数据,把一些元素放在一个集合当中,另外一些元素放在另一个一个集合当中. 对于它的操作有:查看两个元素是否在一个集合当中.合并两个元素. 合并的时候采取的策略是这样的: ...
- C#高级编程9-第6章 数组
数组 1.同一类型和不同类型的多个对象 需要使用同一类型的多个对象则使用集合和数组. Array类为数组元素排序和过滤提供了多个方法,使用枚举器,可以迭代数组所有元素. 2.简单数组 数组的声明 因为 ...
- asp.net 判断日期是否为空
if (Birthday == DateTime.MinValue) { //u can do something here } 首先确保Birthday是不可为null的日期类型.如果可为null就 ...
- php模块组成
php总共有三个模块:内核.ZEND引擎.扩展. 内核是用来处理请求.文件流.错误处理等操作的: ZEND引擎是将源文件转换成机器语言,然后在虚拟机上运行: 扩展层是一组函数.类库和流,php使用它们 ...
- Redis系列之(一):10分钟玩转Redis
1. Redis介绍 Redis是一个开源的使用ANSI C语言编写.基于内存的Key-Value数据库. 它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集 ...
- 最小生成树-普利姆算法lazy实现
算法描述 lazy普利姆算法的步骤: 1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q: 2.从Q出队最轻边,将此边加入MST. 3.考察此边的 ...
- Git_创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...