Netty源码-业务流程之写数据

news2024/9/30 20:31:32

Netty基本介绍,参考 Netty与网络编程

1、源码分析,EchoServerHandler之Write流程

在这里插入图片描述

1.1 write流程入口

通常我们通过ChannelRead收到消息后,需要给一个响应,通过ctx.write()将响应返回客户端。

在自定义handler的channelRead方法打一个断点,客户端发起请求,并进入ctx.write
在这里插入图片描述

1.2 AbstractChannelHandlerContext#write方法

我们看到下图中,先通过findContextOutbound方法找到下一个责任节点再执行。

如果我们自定义方法里用的是ctx.writeAndFlush(写入并发送数据),那么下面就是走第一个分支,否则走第二个分支,继续进入next.invokeWrite
在这里插入图片描述

1.3 invokeWrite写入数据方法

进入了责任链的头节点HeadContext的invokeWrite方法,接着进入invokeWrite0

在这里插入图片描述

1.4 invokeWrite0执行handler写入方法

这里根据handler的类型调用不同的实现类的方法,我们这里是headContext.write方法,继续进入
在这里插入图片描述

1.5 AbstractChannel.AbstractUnsafe#write方法

我们来到AbstractChannel.AbstractUnsafe#write,又是Unsafe类型,Netty的大量读写操作在这个类,进入最后一行的方法addMessage,该方法里面有对写入高水位的判断,

然后再addMessage方法中进入incrementPendingOutboundBytes
在这里插入图片描述

1.6 ChannelOutboundBuffer#incrementPendingOutboundBytes高水位判断

下图,判断待发送的size是不是高于高水位(默认高水位是60M),如果是,那么unwritable设置为false。应用可以根据这个标志决定是否继续发送数据。
在这里插入图片描述

通过CAS操作,设置buffer的unwritable属性:
在这里插入图片描述

1.7 应用层如何处理unwritable标志

如图,应用层可以通过上下文ctx获取可以标志,这个标志最终是从ChannelOutboundBuffer里获取的
在这里插入图片描述
在这里插入图片描述

2、Flush流程

2.1 EchoServerHandler.channelReadComplete

在自定义handler的channelReadComplete方法打一个断点,客户端发起请求,并进入ctx.flush,一直往下走,我们来到DefaultChannelPipeline.HeadContext#flush方法
在这里插入图片描述
在这里插入图片描述

2.2 进入AbstractChannel.AbstractUnsafe#flush0方法

又来到的unsafe的Flush方法,进入doWrite
在这里插入图片描述

2.3 NioSocketChannel#doWrite写操作执行16次

写数据在do-while循环中执行,默认执行16次,writeSpinCount初始是16。如果16次没有完成,截止schedule一个新的flush task出来,而不是注册写事件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 NioSocketChannel#doWrite的while循环

看一下doWrite的while循环

  • 最多返回1024个buffer,总数量尽量不超过maxBytesPerGatheringWrite
  • nioBufferCnt=1 ,单个bytebuffer
  • nioBufferCnt>1 ,批量数据多个bytebuffer。如果缓冲区写满了,注册写事件,启用更多线程来处理
    在这里插入图片描述
    在这里插入图片描述

3.总结

写数据首先通过Write将数据写入Buffer(ChannelOutboundBuffer),然后通过Flush将数据发送出去。写数据包含两个流程Write和flush。

1、Netty写数据太多时,超过一定水位线,会将unwritable标志置为false,应用端根据这个标志决定要不要发送数据

2、只要有数据,就一直写,写到16次,如果还没有写完,会重启一个线程继续写

3、批量写数据是,如果尝试写的都写入了,下次会尝试更多。

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

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

相关文章

极限电流型氧传感器的工作原理以及有哪些应用场景?

极限电流型氧传感器的工作原理: 极限电流型氧传感器的工作原理基于稳定ZrO2固体电解质的氧泵作用。在已稳定化ZrO2两侧被覆铂电极,阴极侧用有气体扩散孔的罩接合,形成阴极空腔。在一定的温度下,当ZrO2电极两侧加一定电压时&#…

使用AOP处理参数

说明:在一些时候,我们需要在接口介绍到参数前处理参数,像参数校验、参数转换等,本文介绍如何使用AOP来实现此需求。 场景 需求:有一批开放给第三方调用的接口,之前传递的都是用户表的ID,现在需…

vscode 内网不联网如何导入vscode插件

如果有小伙伴百度到这篇文章,那一定是遇到了在内网开发不能联网的问题,那就往下看看吧。 安装一个新的Visual Studio Code,需要必要的一些插件,但是不能联网,于是自带的扩展程序安装便不能用了。 1、在一台能访问外网…

Kali Linux入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

作为一名从事渗透测试的人员,不懂Kali Linux的话,就out了。它预装了数百种享誉盛名的渗透工具,使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集,包括12份Kali Linux渗透…

数据结构-栈(理解版)

一、栈的定义 相信大家对于栈或多或少有一些了解,可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)!当然(last in,first out)是栈最有特色的性质。 这里可以给大家一些比较好理解的例…

车辆重识别(改进的去噪扩散概率模型)论文阅读2024/9/29

所谓改进的去噪扩散概率模型主要改进在哪些方面: ①对数似然值的改进 通过对噪声的那个方差和T进行调参,来实现改进。 ②学习 这个参数也就是后验概率的方差。通过数据分析,发现在T非常大的情况下对样本质量几乎没有影响,也就是说…

Python库matplotlib之四

Python库matplotlib之四 小部件(widget)RadioButtons构造器APIs应用实列 Slider构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例,并将其作为第一个参数传递。 Matplotlib不会试图布局这些小部件…

基于Springboot+Vue的c语言学习辅导网站的设计与实现 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

美洽客户服务AI Agent 1.0,全渠道多场景赋能业务增长

“到 2025 年,由 AI 驱动的客户服务交互将增长 400%。” ——Gartner “70% 的企业报告称,在实施 AI 驱动的客户服务平台后,客户满意度分值提升。” ——麦肯锡 在美洽 AI 中心负责人看来,未来几年,AI 之于企业将由辅助…

国内ChatGPT镜像网站整理汇总【OpenAI o1/GPT 4o】-2024/10月最新

一、中文镜像站 ①yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画、文件上传 ②chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT ③AI Chat 支持GPT3.5/4,4o以及MJ绘画 1. 什么是镜像站 镜像站(mirrored site&am…

解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘

问题现象: 某客户反馈在执行脚本的时候文件夹显示存在问题,如下图: 但是脚本文件中的内容并没有\r字符,如下图: 也有客户反馈如下: 问题分析: $\r’是回车符的转义表示。在Unix和Linux系统中,回车符是一个不可见的控制字符,它通常用于文本文件中的行结尾。以上…

多线程——进程与线程(详解)

前言 在前一篇文章末尾我简单介绍了操作系统,在操作系统中有一个核心的概念就是进程,然而从本篇文章起,就要开始JAVA语言多线程的讲解了,所以在此之前,本篇文章作为多线程的前序铺垫,一是介绍进程与线程的…

SV830C产品介绍

SV830C产品介绍 SV830C是一款由珠海亿智科技有限公司(Zhuhai Eeasy Technology Co., Ltd.,品牌名为EEASYTECH)倾力打造的专业AI系统级芯片(SoC),专为视频编码产品而设计。这款芯片不仅集成了先进的神经网络…

湖州市自闭症寄宿学校:个性化关爱让每个孩子都能茁壮成长

在探索自闭症儿童教育的广阔领域中,湖州市的自闭症寄宿学校以其个性化的教育模式,为众多家庭点亮了希望之光。然而,当我们把视线转向中国南方的一座现代化大都市——广州,会发现另一所同样在自闭症儿童教育领域深耕细作、成果斐然…

满填充透明背景二维码生成

前几天项目上线的时候发现一个问题:通过Hutool工具包生成的二维码在内容较少时无法填满(Margin 已设置为 0)给定大小的图片。因此导致前端在显示二维码时样式异常。 从图片中我们可以看到,相同大小的图片,留白内容是不一样的。其中上半部分…

RuoYi-Vue实现后台管理系统去掉首页/默认跳转动态路由第一个路由

云风网 云风笔记 云风知识库 RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于SpringBoot、Spring Security、Jwt、Vue的前后端分离的后台管理系统 内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定…

【代码实现】opencv 高斯模糊和pytorch 高斯模糊

wiki百科 Gaussian Blur,也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。 opencv实现 opencv实现高斯滤波有两种方式, 1、是使用自带的cv2…

怎样把两个视频合并成一个视频?批量合并视频看好这6个工具!

★ 怎样把两个视频合并成一个视频? 随着视频内容的日益丰富,我们常常需要将多个视频片段合并成一个完整的视频文件,不管将2个视频合并拼接到一个进行播放,还是直接合并2个短视频变成长视频,都可以通过这6个工具进行处…

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书,由受信任的证书颁发机构(CA)颁发,用于在互联网通信中建立加密链接。SSL代表“安全套接层”,是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…

PWA(Progressive web APPs,渐进式 Web 应用): manifest.json、 Service Worker

文章目录 引言I 什么是 PWA功能特性技术上分为三个部分安装应用II Web 应用清单将Web 应用清单文件链接到站点manifest.json字段说明III Service Worker( 缓存管理)IV 结合构建工具让项目支持 PWA应用使用插件vite-plugin-pwaworkbox-webpack-plugin插件扩展知识将 PWA 作为脱机…