《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)

目录

  • AcceptThread
    • 数据结构
    • 构造函数
    • run()
  • SelectorThread
    • 数据结构
    • processAcceptedConnections()
    • select()
    • processInterestOpsUpdateRequests()

本文开始分析 ServerCnxnFactory的工作原理,按照顺序我们这样分析:

  1. 建立连接
  2. 监听读写事件
  3. 处理读写就绪的事件
  4. 连接的过期管理

AcceptThread

首先是AcceptThread线程,当有客户端连接服务器时,该线程会监听到连接请求。

数据结构

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第1张图片

构造函数

在这里插入图片描述

run()

AcceptThread本质是线程,当获得CPU资源后会执行它的run()方法,我们看下它的run()方法是如何处理监听到的事件的。
《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第2张图片

接下来我们看下当收到客户端连接请求时是如何转交给SelectThread处理的。
《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第3张图片

AcceptThread的工作就到此结束,接下来就到SelectorThread。

SelectorThread

AcceptThread线程通过调用addAcceptedConnection()方法将新连接交付给SelectorThread,我们先看下该方法的内容:
《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第4张图片

该方法很简单,就是将连接添加到acceptedQueue队列中然后唤醒selector,接下来具体分析SelectorThread

数据结构

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第5张图片

它的数据结构很简单,一个selector和两个队列

  1. acceptedQueue存储来自客户端的连接请求
  2. 在处理IO之前会把SelectionKey的监听事件清零,此时会把这个key存放到updateQueue中,等IO处理结束再恢复监听。

SelectorThread是一个线程,核心代码在run()方法上
《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第6张图片

run()方法中核心代码主要是第一个循环的三个方法select()processAcceptedConnections()processInterestOpsUpdateRequests()。为了更好的理解run()的处理逻辑,我们对着三个方法的分析调整一下顺序:

  1. processAcceptedConnections(),接收来自客户端的连接
  2. select(),监听来自客户端的OP_READ事件
  3. processInterestOpsUpdateRequests(),处理完channel的请求后恢复它监听的事件类型

processAcceptedConnections()

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第7张图片

NIOServerCnxn实例维护每一个客户端的连接,服务端与客户端的所有通信都是由它负责的,它负责统一接收来自客户端的所有请求,并将请求内容从底层网络I/O中完整第读取出来,后续再详细分析该类。

select()

与客户端的连接建立后开始监听来自客户端的请求
《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第8张图片

继续看handleIO()方法
《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第9张图片

select()的过程主要是selector调用select()方法获取IO就绪的key,然后将这些key转交给worker线程处理。这里要注意,当它监听到一个IO请求时,在完成这个请求之前会停止监听来自客户端的请求。

processInterestOpsUpdateRequests()

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第10张图片

processInterestOpsUpdateRequests()主要是负责更新updateQueue中key的监听事件类型,在WorkerService处理完请求后会获取updateQueue中的key进行更新。

SelectorThread的工作流程就介绍到,接下来到真正处理IO的WorkerService

篇幅限制,下文继续​。

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)_第11张图片

你可能感兴趣的:(Zookeeper,zookeeper,分布式)