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

news2024/11/13 15:16:39

目录

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

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

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

AcceptThread

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

数据结构

在这里插入图片描述

构造函数

在这里插入图片描述

run()

AcceptThread本质是线程,当获得CPU资源后会执行它的run()方法,我们看下它的run()方法是如何处理监听到的事件的。
在这里插入图片描述

接下来我们看下当收到客户端连接请求时是如何转交给SelectThread处理的。
在这里插入图片描述

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

SelectorThread

AcceptThread线程通过调用addAcceptedConnection()方法将新连接交付给SelectorThread,我们先看下该方法的内容:
在这里插入图片描述

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

数据结构

在这里插入图片描述

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

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

SelectorThread是一个线程,核心代码在run()方法上
在这里插入图片描述

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

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

processAcceptedConnections()

在这里插入图片描述

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

select()

与客户端的连接建立后开始监听来自客户端的请求
在这里插入图片描述

继续看handleIO()方法
在这里插入图片描述

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

processInterestOpsUpdateRequests()

在这里插入图片描述

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

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

篇幅限制,下文继续​。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图像去噪的滤波器】非局部均值滤波器的实现,用于鲁棒的图像去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Selenium 自动化测试实战笔记1

1. 安装 selenium pip install selenium 3.11.0 # 安装指定版本 pip install selenium -U # 安装最新版本 pip show selenium # 查看当前版本 pip uninstall selenium # 卸载 报错解决1: 带上代理 pip install selenium -i http://mirrors.aliyun.com/…

C++项目:在线五子棋对战(网页版)

项目介绍 本项⽬主要实现⼀个⽹⻚版的五⼦棋对战游戏,其主要⽀持以下核⼼功能: • 用户管理:实现用户注册,用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等。 • 匹配对战:实现两个玩家在网页端根据天梯分数匹配游戏对⼿&…

图的遍历之 深度优先搜索和广度优先搜索

深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各…

亚马逊 EC2服务器下部署java环境

1. jdk 1.8 安装 1.1 下载jdk包 官网 Java Downloads | Oracle tar.gz 包 下载下来 1.2 本地连接 服务器 我用的是亚马逊的ec2 系统是 ubuntu 的 ssh工具是 Mobaxterm , 公有dns 创建实例时的秘钥 链接 Mobaxterm 因为使用的 ubuntu 所以登录的 名称 就是 ubuntu 然后 …

Leetcode每日一题:2681. 英雄的力量(2023.8.1 C++)

目录 2681. 英雄的力量 题目描述: 实现代码与解析: 数学规律 原理思路: 2681. 英雄的力量 题目描述: 给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的…

【kubeadm的配置安装】

目录 一、环境准备二、所有节点安装docker三、部署K8S集群1、查看镜像2、初始化kubeadm方法一:1、修改配置文件2、在线拉取镜像3、初始化 master 方法二、 3、设定kubectl4、所有节点部署网络插件flannel 四、部署 Dashboard1、在 master01 节点上操作 master&#…

分布式事务面试题

一、事务简介 事务(Transaction)是操作数据库中某个数据项的一个程序执行单元(unit)。 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 1.1、名词解释 事务:事务是由一组操作构成的可靠的独立的工作单元&#x…

【前端】Vue生命周期函数(详细讲解+中文图解)

目录 一、何为生命周期1、含义2、理解 二、生命周期定义(官网)1、vue22、vue3 三、生命周期图解1、vue2生命周期图解2、vue3生命周期图解 四、Vue的生命周期五、Vue2生命周期和Vue3生命周期的区别六、Vue生命周期的主要阶段以及8个周期函数1、options AP…

BM5 合并k个已排序的链表 javascript

描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围: 示例1 输入: [{1,2,3},{4,5,6,7}] 返回值: {1,2,3,4,5,6,7}示例2 输入: [{1,2},{1,4,5},{6}] 返回值: {1,1,2,4,5,6}解题思路 利用两个…

Python numpy中的correlate相关性详解

看代码看见这个方法,记录一下,这个是人家官网的链接np.correlate 云里雾里的,其实就是两个数组点乘,不同模式就是错位点乘,直接看代码 a是原本的数组,v就是滤波器,对应相乘 import numpy as …

分布式 - 消息队列Kafka:Kafka生产者发送消息的3种方式

文章目录 1. Kafka 生产者2. kafaka 命令行操作3. Kafka 生产者发送消息流程4. Kafka 生产者发送消息的3种方式1. 发送即忘记2. 同步发送3. 异步发送 5. Kafka 消息对象 ProducerRecord 1. Kafka 生产者 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序,它们…

什么是React?React与VU的优缺点有哪些?

什么是React?什么是VUE? 维基百科上的概念解释,Vue.js是一个用于创建用户界面的开源MVVM前端JavaScript框架,也是一个创建单页应用的Web应用框架。Vue.js由尤雨溪(Evan You)创建,由他和其他活跃…

【Go语言】Golang保姆级入门教程 Go初学者chapter3

Go语言 第三章 运算符 下划线“_”本身在Go中一个特殊的标识符,成为空标识符。可以代表任何其他的标识符,但是他对应的值就会被忽略 仅仅被作为站维度使用, 不能作为标识符使用 因为Go语言中没有private public 所以标记变量首字母大写代表其…

Pytorch量化之Post Train Static Quantization(训练后静态量化)

使用Pytorch训练出的模型权重为fp32,部署时,为了加快速度,一般会将模型量化至int8。与fp32相比,int8模型的大小为原来的1/4, 速度为2~4倍。 Pytorch支持三种量化方式: 动态量化(Dynamic Quantization&…

最大异或对

如果你觉得这篇题解对你有用,可以点个赞或关注再走呗,谢谢你的关注~ 分析 最大异或对 (1)最大异或对是运用trie树存储十进制数对应的二进制数的每一位。 (2)再根据trie树的每一位进行搜索查找,严格满足不同的数异或为1,相同的异…

【业余小练习】交互式网格自定义增删改(进行中)

学习SQL和PLISQL数据类型的区别和应用场景 Oracle plsql 基础篇1 数据类型以及流程控制_bb_tarek的博客-CSDN博客https://blog.csdn.net/bb_tarek/article/details/17555713?ops_request_misc&request_id&biz_id102&utm_termplsql%E5%9F%BA%E6%9C%AC%E6%95%B0%E6…

Unlikely argument type for equals(): String seems to be unrelated to T

Unlikely argument type for equals(): String seems to be unrelated to Integer Unlikely argument type for equals(): String seems to be unrelated to Date 多余代码

java代码审计9之XXE

文章目录 1、简介2、 java XXE审计函数3、漏洞3.1、正常的业务3.2、有回显的情况3.3、无回显的情况3.4、修复 之前的文章, php代码审计9之XXE 1、简介 XXE(XML外部实体注⼊,XML External Entity) ,在应⽤程序解析XML输⼊时&…

【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带4

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…