近期一直在忙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代码解读的更多相关文章

  1. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  2. 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案

    简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...

  3. SoftmaxLayer and SoftmaxwithLossLayer 代码解读

    SoftmaxLayer and SoftmaxwithLossLayer 代码解读 Wang Xiao 先来看看 SoftmaxWithLoss 在prototext文件中的定义: layer { ...

  4. Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...

  5. Jsoup代码解读之六-防御XSS攻击

    Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...

  6. Jsoup代码解读之五-实现一个CSS Selector

    Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张s ...

  7. Jsoup代码解读之四-parser

    Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...

  8. Jsoup代码解读之三-Document的输出

    Jsoup代码解读之三-Document的输出   Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前 ...

  9. Jsoup代码解读之一-概述

    Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学 ...

随机推荐

  1. BZOJ.4516.[SCOI2016]幸运数字(线性基 点分治)

    题目链接 线性基可以\(O(log^2)\)暴力合并.又是树上路径问题,考虑点分治. 对于每个点i求解 LCA(u,v)==i 时的询问(u,v),只需求出这个点到其它点的线性基后,暴力合并. LCA ...

  2. 网络抓包及Http Https通信协议分析

    Wireshark基本介绍和学习TCP三次握手 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括ht ...

  3. hdu 4536 dfs

    题意:XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选 ...

  4. 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】

    上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...

  5. codevs 1052 地鼠游戏 优先队列

    1052 地鼠游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1052/ Descriptio ...

  6. php中赋值和引用真真的理解

    php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. ...

  7. LNMP 1.2升级Nginx、MySQL/MariaDB、PHP教程

    一般情况下不建议对生产环境进行升级,升级开始后会停止LNMP相关服务.本文仅适用于LNMP1.2及以后版本! 在LNMP目前LNMP v1.2中已经包含了Nginx.MySQL/MariaDB.PHP ...

  8. OllyDbg 使用笔记 (十二)

    OllyDbg 使用笔记 (十二) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 演示样例程序下载地址:http://pan.baidu.com/s/1eQiV6aI 安装好程序 ...

  9. BMP文件格式实例分析

    1. 以下为一个RGB565-16位BMP位图实际的部分数据: 00000000h: 42 4D 46 58 02 00 00 00 00 00 46 00 00 00 28 00 ; BMFX... ...

  10. 【C#高级编程】笔记之核心C#

    Main()方法 每一个C#可执行文件(如控制台程序.Windows程序和Windows服务)都必须有一个入口点——Main()方法(注意M大写). 这个方法必须是类或静态方法,并且返回类型必须是in ...