第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述

news2025/1/3 11:05:54

前言

本文介绍了 ES 使用的网络模型,并介绍 transport,http 接收、响应请求的代码入口。

网络 IO 模型

Node 在初始化的时候,会创建网络模块。网络模块会加载 Netty4Plugin plugin。
而后由 Netty4Plugin 创建对应的 transports,以及 http server。
代码分别入口为:Netty4Plugin#getTransportsNetty4Plugin#getHttpTransports

众所周知,Netty 中使用的网络 IO 模型是 主从 Reactor。
接下来带大家一起看创建的细节。

Transport

代码入口为构造函数 Netty4Transport
因为 transport 主要用于内部,因此既有 ServerBootstrap,又有 Bootstrap
ServerBootstrapNetty 中表示 Server 的类。
BootstrapNetty 中表示 Client 的类。

ES 使用的是 NioEventLoopGroup,其底层实现基于 Java NIO
JAVA NIO 在不同的平台上,会执行不同的系统调用。例如,在 Linux(2.6之后) 会使用 epoll

创建 NioEventLoopGroup 的代码入口为:SharedGroupFactory#getGenericGroup(),默认会创建 Runtime.availableProcessors()EventLoop(工作线程),可通过 transport.netty.worker_count 修改创建的个数。

其中,Server 和 Client 会共用同一个 NioEventLoopGroup。代码入口 Netty4Transport#doStart()

接收请求代码入口:
Netty4MessageChannelHandler#channelRead(ChannelHandlerContext ctx, Object msg)

响应请求代码入口:
Netty4MessageChannelHandler#write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)

http server

创建

代码入口为构造函数 Netty4HttpServerTransport。在 doStart() 函数中描述了 ServerBootstrap 的创建过程。

默认情况下 http server 和 transport 共用同一个 NioEventLoopGroup。如果想改变这个行为,需要设置 http.netty.worker_count 的值大于 0。描述这段逻辑的代码入口为:SharedGroupFactory#getHttpGroup()

接收 http 请求

接收请求的入口为:Netty4HttpRequestHandler#channelRead0(ChannelHandlerContext ctx, HttpPipelinedRequest httpRequest)

与我们所熟知的 MVC 框架类似,请求进来后,都会交由某个类去做请求的分发。在 ES 中,负责分发请求的类为:RestController#dispatchRequest(RestRequest request, RestChannel channel, ThreadContext threadContext)
不同的请求可能会运行在不同的业务线程上。

响应 http 请求

响应 http 请求的入口为: Netty4HttpResponseCreator#encode
Netty4HttpResponseCreator 继承的是 Netty 的 MessageToMessageEncoder 类。该类在可以写就绪时,会自动调用 write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) 方法,而 write 方法中则会调用 encode 方法,因此这里说,入口是 encode 方法。

本文由mdnice多平台发布

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

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

相关文章

【Spring MVC 核心机制】核心组件和工作流程解析

在 Web 应用开发中,处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架,将这些复杂的操作高度抽象化,通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差:模型在训练数据上的误差 泛化误差:模型在新数据上的误差 验证数据集:一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集:只能用一次 K则交叉验证 在没有足够数据时使用 算法…

计算机网络-L2TP Over IPSec基础实验

一、概述 上次我们进行了标准L2TP的配置,但是在最后我们在进行业务流量访问时看到流量是没有进行加密的,这就导致可能得安全风险,所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec,然…

fiscoBcos一键部署webase平台

一键部署webase平台 一键部署可以在同机快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台 一键部署会搭建:节点(FISCO-BCOS 2.0)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Nod…

论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试

大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

QT集成IntelRealSense双目摄像头3,3D显示

前两篇文章,介绍了如何继承intel realsense相机和opengl。 这里介绍如何给深度数据和色彩数据一块显示到opengl里面。 首先,需要了解深度数据和彩色数据是如何存储的。先说彩色数据。彩色图像一般都是RGB,也就是每个像素有三个字节&#xf…

PHP框架+gatewayworker实现在线1对1聊天--gatewayworker说明(2)

文章目录 gatewayworker使用说明onConnect 说明 gatewayworker使用说明 gatewayworker里只需要使用Applications\YourApp下的Events.php文件。 对文件的代码进行一下改造,如下,我们只需要用到onConnect方法,写法固定,其他方法都…

未授权访问漏洞集合

Redis未授权访问漏洞 进入vulhub目录启动靶机 进⼊⽬录:cd /vulhub-master/redis/4-unacc 启动:docker-compose up -d 检查:docker ps 在Kali上安装redis程序 #安装redis apt-get install redis #redis链接 redis-cli -h 124.221.58.83 -…

环,域,体,整区,理想,极大理想,

环: 定义: 加法交换群 乘法半群 分配律 域的定义: 加法交换群 乘法群(去掉0元是交换群) 分配律 Eg:比如整数集合不是域,因为对于乘法来说,去掉0后没有单位元了,但是是环 Eg…

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…

基于MPPT算法的光伏并网发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT算法的光伏并网发电系统simulink建模与仿真,包括PV光伏发电模块,并网电路,MPPT,PWM等模块。 2.系统仿真结果 3.核心程…

NAT 技术如何解决 IP 地址短缺问题?

NAT 技术如何解决 IP 地址短缺问题? 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 随着互联网的普及和发展,IP 地址的需求量迅速增加。尤其是 IPv4 地址&…

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…

java: JDK isn‘t specified for module ‘product-service‘问题解决

目录 问题 解决方法 1.打开File->Project Structure... 2.将Project SDK修改为17 Oracle OpenJDK 17.0.12,并Apply,OK 问题 添加module后报错:java: JDK isnt specified for module product-service 查看pom.xml文件也添加了对应的JDK…

慧集通iPaaS低代码平台培训-基础篇

训练使用素材: 1.数据源: 单号业务日期工厂仓库物料单位数量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…

CMS漏洞靶场攻略

DeDeCMS 环境搭建 傻瓜式安装 漏洞一:通过文件管理器上传WebShel 步骤⼀:访问目标靶场其思路为 dedecms 后台可以直接上传任意文件,可以通过⽂件管理器上传php文件获取webshell 登陆网站后台 步骤二:登陆到后台点击 【核心】 --》 【文件式…

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路,也称为传输介质或传输媒介,并不包含在计算机网络体系结构中,而是处于物理层之下。 一、传输媒体的分类 导向型媒体:电磁波被导引沿着固体媒体传播。常见的导向…

光储充一体化解决方案详解。

一、光储充介绍 1、什么是光储充 “光储充”一体化,顾名思义,是由光伏发电、储能、充电集成一体、互相协调支撑的绿色充电模式。其工作原理是利用光伏发电,余电由储能设备存储,共同承担供电充电任务。在用电高峰,光储…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析(Global Sensitivity Analysis, GSA),其中Sobol方法是一种流行的技术,用于评估模型输入…