《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程

news2024/10/5 22:22:13

目录

  • ServerCnxnFactory
    • 1. 创建ServerCnxnFactory
    • 2. 配置属性configure()
    • 3. 启动start()

ServerCnxnFactory

Zookeeper使用ServerCnxnFactory管理与客户端的连接,服务端每与一个客户端就会创建一个ServerCnxn实例并由ServerCnxnFactory管理,ServerCnxnFactory是一个抽象类,它有两个实现,可在配置文件zoo.cfg中通过设置zookeeper.serverCnxnFactory属性指定具体实现,默认使用NIOServerCnxnFactory
在这里插入图片描述

QuorumPeerMain类集群方式启动的时关于ServerCnxnFactory的启动过程大致如下:
在这里插入图片描述

整个过程大体分为4步:

  1. 调用ServerCnxnFactory的静态方法createFactory()创建实例
  2. 根据配置文件的属性进行初始化
  3. 设置到QuorumPeer的属性中
  4. QuorumPeer调用start()方法启动ServerCnxnFactory实例

接下来逐步分析ServerCnxnFactory的创建及启动过程。

1. 创建ServerCnxnFactory

QuorumPeerMain启动过程中创建ServerCnxnFactory的代码如下:

在这里插入图片描述

默认情况下只创建cnxnFactory,接下来看下ServerCnxnFactory.createFactory()方法。
在这里插入图片描述

NIOServerCnxnFactory的无参函数是个空函数,后续通过调用configure()函数进行参数赋值及初始化。

2. 配置属性configure()

先看下NIOServerCnxnFactory的数据结构:
在这里插入图片描述

在这些属性中最重要的是四类线程:

  1. accept线程,此类线程只有一个。它主要是接收来自客户端的连接并将其分配给select线程
  2. select线程,有N个,可通过zookeeper.nio.numSelectorThreads设置。监听读写事件并交给worker线程具体处理。
  3. worker线程,用来负责socket的读写,有N个。处理具体的请求。
  4. expirer线程,用于管理连接的线程,只有1个。管理过期的连接。

接下来看下configure()方法对这些属性的初始化:
在这里插入图片描述

acceptThread传进去的addr即客户端地址,即clientPort配置的端口号,默认2181。

3. 启动start()

属性配置完后就通过start()方法启动,源码过程如下:
在这里插入图片描述

start()的过程主要是启动了四类线程,至此,ServerCnxnFactory已经启动成功,下文继续分析它的工作原理。
在这里插入图片描述

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

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

相关文章

SAP MM学习笔记15-物料调达中的Master数据(3)-购买情报

SAP中做一个购买发注的时候,涉及到以下Master数据: 1,仕入先Master(供应商):跟谁买 2,品目Master(物料):买什么 3,购买情报:什么价…

[C++项目] Boost文档 站内搜索引擎(5): cpphttplib实现网络服务、html页面实现、服务器部署...

在前四篇文章中, 我们实现了从文档文件的清理 到 搜索的所有内容: 项目背景: 🫦[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…文档解析、处理模块parser的实现: 🫦[C项目] Boost文档 站内搜索引擎(2): 文档文本解析模块…

【使用基于二阶积分器的结构生成正交信号】基频共振而无延迟地滤波信号的正交信号生成模块,为单相系统创建 α/β 信号(Simulink实现)

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

Nacos本地部署-开发使用

有些项目,需要在本地启动nacos,否则会与其他开发人员产生冲突,这里是写给该场景下的开发人员使用的文档 一、如何本地部署和使用 Nacos 1.下载编译后的压缩包 可以在 github 上 Nacos Release 版本列表中下载最新的稳定版本。地址&#xf…

用Shap-E生成3D模型

Shap-E 是 OpenAI 开发的突破性模型,它使用文本或图像作为输入生成一系列 3D 对象,以其创新方法改变了 3D 应用领域。 这项非凡的技术可以在 GitHub 上免费获取,允许用户在计算机上无缝运行它,而无需 OpenAI API 密钥或互联网连接…

AAAI论文阅读

文章目录 Open-Vocabulary Multi-Label Classifcation via Multi-Modal Knowledge Transfer——知识蒸馏的范畴Med-EASi: Finely Annotated Dataset and Models for Controllable Simplifcation of Medical Texts——医学领域数据集构建“Nothing Abnormal”: Disambiguating M…

测试数据不会造?可以用这个工具Faker

在测试过程中,大家应该都遇到过各种各样的数据构造问题。e.g. 构造一批通讯录、构造一批用户三要素(姓名手机号身份证)、构造一批银行卡数据…… 这时候,测试数据大多数可能是这样的: 张三, 130 0000 0001 李四, 130 0000 0002 王五, 130 0000 0003 …

Scons编译lib库

实例目录结构: include文件夹:test.hsrc文件夹:test.cSConscriptSConstruct 如下图所示: SConstruct: #执行当前目录下的SConscript SConscript(SConscript);SConscript: import os from SCons.Script…

模拟实现消息队列项目(系列6) -- 网络通信协议的设计

目录 前言 1. 明确需求 2. 设计应用层协议 2. 定义Request 和 Response 3. 定义参数的父类 4. 定义其他参数类 4.1 创建交换机 4.2 删除交换机 4.3 创建队列 4.4 删除队列 4.5 创建绑定 4.6 删除绑定 4.7 发布消息 4.8 订阅消息 4.9 推送消息 结语 前言 上一章节,我们完成了虚拟…

实现栈和队列

文章目录 1.栈 1.1 栈的概念及结构 1.2 栈的实现 实现栈的标识索引 数组实现栈 栈的结构定义 栈空间数据的初始化和销毁 入栈和出栈 获取栈顶元素、计算栈空间元素个数、判空 2.队列 2.1 队列的概念及结构 2.2 链表的实现 实现链表的标识索引 链表实现队列 定…

JavaScript基础 第一天

本套笔记是通过学习B站Pink老师JavaScript核心进阶 前端必学总结的学习笔记,希望自己之后在使用的过程中能够将所学知识融会贯通 学习目标 1. 理解变量是存储数据的容器 2.理解什么是数据并知道数据的类型 3.知道JavaScript数据类型转换的特征 学习目录 1.Jav…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

JVM垃圾回收篇-垃圾回收算法与五种引用

JVM垃圾回收篇-垃圾回收算法与五种引用 引用计数法 引用计数(英语:reference counting,RC)是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保…

mac安装open3d时候出现错误

在测试open3d是否正常顺利安装时&#xff0c;出现了如下错误&#xff1a; python -c "import open3d as o3d; print(o3d.__version__)" Traceback (most recent call last):File "<string>", line 1, in <module>File "/Users/huangzhe/…

【产品设计】消息通知系统设计

消息通知可以将内容实时送达用户手机页面&#xff0c;但是泛滥的消息通知会引起用户的反感&#xff0c;也违背了这个设计的初衷。 消息通知可以及时地将状态、内容的更新触达到用户&#xff0c;用户则可以根据收到的消息做后续判断。但是如果没有及时将重要消息触达到用户或者滥…

Java基础入门篇——数据类型(六)

目录 一、基本数据类型 1.1整型类型变量 1.2浮点型 1.3字符型 1.4布尔型 二、引用数据类型 Java是一个强类型语言&#xff0c;Java中的数据必须明确数据类型。数据类型的作用就是约束变量存储数据的形式。例如&#xff0c;定义为int类型存储整数&#xff0c;定义为double…

【分布式流控组件 Sentinel 快速入门】——图文详解操作流程

&#x1f4a7; 分布式流控组件 S e n t i n e l 快速入门 \color{#FF1493}{分布式流控组件 Sentinel 快速入门} 分布式流控组件Sentinel快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#…

ThreadPoolExecutor线程池详解

ThreadPoolExecutor线程池详解 1. 背景 项目最近的迭代中使用到了ThreadPoolExecutor线程池&#xff0c;之前都只是知道怎么用&#xff0c;没有了解过线程池的底层原理&#xff0c;项目刚上线&#xff0c;有时间整理一下线程池的用法&#xff0c;学习一下线程池的底层实现与工…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132122450 Stable Diffusion 的 Prompt 的功能&#xff0c;可以用文字来描述想要生成的图像&#xff0c;根据输入来创造出逼真的图像。Prompt 支持…

Mysql面试题(查询重复数据删除重复数据)

Create table A (id int) 注意&#xff1a;id列非自增&#xff0c;由代码产生并输入&#xff0c;但代码可能产生重复id 1.业务定义中&#xff0c;id列不允许重复&#xff0c;用什么方式保证重复的id不会被输入表中&#xff1f; 2.若已经发生数据重复&#xff0c;请写出SQL语…