zookeeper学习笔记之-Zookeeper单机模式下的启动流程与数据接收模型

本文详细介绍了Zookeeper单机模式下的启动流程,包括从启动类QuorumPeerMain开始,解析配置,初始化FileTxnSnapLog,ZooKeeperServer,AdminServer,直至创建连接工厂和开启ServerSocketChannel。数据接收模型中,AcceptThread接收Socket连接,生成SocketChannel,分配给SelectorThread处理。SelectorThread通过Selector监听SocketChannel的读写就绪事件,由线程池中的工作线程执行实际的I/O操作,最终由NIOServerCnxn对象处理客户端的命令和数据读取。
摘要由CSDN通过智能技术生成

启动流程

 

启动类:org.apache.zookeeper.server.quorum.QuorumPeerMain

 

  1. 调用ZooKeeperServerMain.main(args)
  2. 把配置解析成ServerConfig对象
  3. 初始化FileTxnSnapLog对象:快照和日志操作工具类
  4. 初始化JvmPauseMonitor
  5. 初始化ZooKeeperServer
  6. 启动AdminServer
  7. 创建NIOServerCnxnFactory对象
  8. 开启ServerSocketChannel,并绑定客户端端口
  9. 初始化WorkerService线程池
  10. 启动多个SelectorThread线程
  11. 启动AcceptThread线程
  12. 根据快照和日志初始化ZKDatabase
  13. 启动Session跟踪器SessionTracker
  14. 初始化RequestProcessor Chain
  15. 启动请求限流器RequestThrottler

 

数据接收模型

AcceptThread线程负责接收Socket连接,没接收到一个Socket连接会生成一个SocketChannel对象,并生成一个NIOServerCnxn对象,然后会把SocketChannel对象分配给某个SelectorThread线程,分配方式是把SocketChannel对象添加到SelectorThread中的acceptedQueue队列中。

 

服务端有多个SelectorThread线程,每个线程负责处理多个SocketChannel的读写就绪事件,SelectorThread线程会不断的从acceptedQueue队列中获取SocketChannel对象并注册读事件到SelectorThread线程中的Selector对象上,同时,SelectorThread线程也会不断的从Selector对象上获取就绪事件。

 

每获取到一个就绪事件,就会把该事件先封装为一个IOWorkRequest对象,然后会把IOWorkRequest对象封装为ScheduledWorkRequest对象,ScheduledWorkRequest是一个线程,然后会把ScheduledWorkRequest扔给线程池进行处理。

 

线程池中的线程执行时,调用的就是IOWorkRequest的doWork方法,而doWork方法中会调用NIOServerCnxn的doIO方法。

 

NIOServerCnxn对象才是真正执行就绪事件的逻辑实现。整个模型相当于,没接收到一个就绪事件,NIOServerCnxn对象就会去处理该事件。

 

当客户端向服务端发送命令是,NIOServerCnxn就会处理读就绪事件,NIOServerCnxn就会从SocketChannel中取读取数据,并进行处理。

 

单机模式下服务端请求处理流程.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值