这里主要分析zookeeper client API的实现方式,以python kazoo的实现代码为蓝本进行逻辑分析.
一.代码框架及介绍
API分为同步模式和异步模式.同步模式是在异步模式的基础上通过一些等待,循环等方式进行实现的.
主要实现逻辑如下:
基本模式就是建立两个线程,一个线程负责发送请求和接收响应.一个负责根据响应执行对应注册的watcher.
大部分语言的实现都是同步模式通过异步模式实现的.在不同的语言里具体有差异.
kazoo的框架实现在client,connection,threading,serlallzation这几个主要的类包中.
client在kazoo项目的根目录,connection,serlallzation在项目的protocol目录,threading在handler目录.
client是主要类.所有zookeeper 接口均在这里实现.
connection是核心实现,所有请求和返回的逻辑处理均在这里处理.
serlallzation是请求封装的实现.将所有请求封装成二进制数据在这里实现.
threading是线程实现的核心.建立线程,以及启动线程和处理线程均在这里实现.
https://github.com/python-zk/kazoo/blob/master/kazoo/client.py详细代码可以看这里.
二.详细逻辑的实现.
1.client的实现
client是将底层逻辑连接和封装起来的地方,存储公共数据的地方.
client的代码实现基本是构造各种基础变量,对象,队列,记录当前socket状态,thread状态.重置各种状态.入口方法,和启动,停止等功能.
简单分析下client下create方法.create方法基本就是检查参数,然后将参数传给create_async(对应的异步方法)方法,create_async将参数通过serlallzation包里的create类封装成request对象.并将这个对象和新的async_object对象传递给入口函数_call._call函数将request对象和async_object对象放到_queue的队列里.之后这个队列由connection里的实现去发送.其他所有zookeeper api的方法都是类是create方法.都是使用同名的async方法通过调用_call来实现.
connection的对象,threading对象都是在client __init__里初始化的.启动线程是在client的start函数里调用threading.start和connection.start实现.
2.connection的实现
这里实现了整个client核心通信的部分.connection通过接收client对象参数,来使用各种client中初始化的公共数据和对象.在connection里核心函数是_connect_attempt函数.这个函数实现了数据交换和通信的核心部分.
_connect_attempt函数主要部分如下.
read_timeout, connect_timeout =self._connect(