Netty-初探

news2024/11/19 23:41:38

引言

最近开始学习网络编程这一块,特此总结

直接内存为什么比堆内内存要快?

JVM在发送堆内数据给远程时,首先会把这部分数据复制到堆外的一块内存空间(防止GC过程中文件引用地址发生变化带来的问题),然后再发送给远程应用。而直接内存省去了这个复制步骤,好处就是更快速并且减少了GC

直接内存的缺点就是难以控制,发生内存泄漏时难以排查。比较适合存简单对象扁平化

Linux常见的零拷贝有哪些?

  • mmap内存映射

直接将文件从硬盘拷贝到用户空间,不再有文件内容从硬盘拷贝到内核空间的缓冲区

扩展:Kafka中有一个Broker用来管理消息,Producer需要把消息发送给Broker,Broker收到消息以后肯定是要做持久化的。Kafka号称单机百万级吞吐量,为什么持久化速度这么快呢?就是使用了磁盘顺序写和mmap的零拷贝技术

java.nio.MappedByteBuffer这个类就是mmap在 Java中应用

  • sendfile

Linux2.1开始支持

DMA模块直接将数据从内核缓冲区传递给协议引擎,注意需要硬件设备支持

DMA:Direct Memory Access,直接内存存取

扩展:同样是Kafka的Broker,Consumer订阅消息时,Broker把消息的数据从磁盘发送到网卡的发送缓冲区这个过程就使用了sendfile技术

FileChannel.transferToFileChannel.transferFrom 就是在Java中的应用

  • splice

Linux2.6.17开始支持

相比sendfile不需要硬件支持

splice直接将两个内核空间的buffer进行pipe(sendfile在DMA硬件不支持的情况下,这里需要一次CPU拷贝)

Netty的零拷贝实现

  • 网络通信

Netty的发送和接收ByteBuffer使用直接内存,减少了堆内存到直接内存的拷贝

  • 缓存操作

Netty提供了CompositeByteBuf类,将多个ByteBuf合并成一个逻辑上的ByteBuf,防止它们之间的互相拷贝

  • 文件传输

Netty通过FileRegion包装的FileChannel.transferTo实现文件传输,直接将文件缓冲区的数据发送到目标Channel

Linux常见的I/O编程模型

1、阻塞IO(blocking IO),BIO

2、非阻塞IO(nonblocking IO)

3、IO复用(select、epoll和poll,IO multiplexing),NIO

4、信号驱动IO(Single Driven IO,SIGIO)

5、异步IO(asynchronous IO)

常见的就是BIO和NIO,严格意义上前四种都是阻塞的,过程中间都存在阻塞,只不过阻塞时可以做其他的事情

通常都会说同步阻塞和异步非阻塞,但是并不代表同步非阻塞和异步阻塞不能用

同步非阻塞:获取资源不存在,线程阻塞了,线程去做其他事,线程会频繁的查询资源是否存在,消耗很多CPU

异步阻塞:Java中创建Future,然后马上调用get方法获取资源,没有多大的意义

总给:同步非阻塞和异步阻塞这两种方式太傻,所以不会有人去使用

接下来主要学习的是NIO

NIO的优势:可以用很少的线程服务很多的用户

select、poll 和 epoll 模型的区别?

// fd数组存储,有连接上限
int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
// fd链表存储,无连接上限
int poll (struct pollfd *fds, unsigned int nfds, int timeout);

// 创建EventPoll对象
int epoll_create(int size);
// 增加或删除监听事件
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 
// 阻塞直到有事件发生
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
selectpollepoll
支持一个进程能打开的最大连接数FD_SETSIZE定义,32位机器是32*32大小,64位机器是32*64大小。可以修改但不建议本质上和select相同,没有最大连接数限制,链表存储连接数受限机器内存大小
FD剧增带来的IO效率问题对连接线性遍历,FD增加后效率线性下降同select根据fd的callback函数实现,活跃的socket才会调用callback。活跃socket多的情况下也有性能问题
消息传递方式内核将消息传递到用户空间,经过拷贝内核将消息传递到用户空间,经过拷贝内核和用户空间共享一块内存

总结:

使用时根据场合以及这三种方式各自的特点

1、表面上epoll效率最高,但是在连接数少并且都很活跃的情况下,select和poll的性能更高,epoll通知机制需要很多回调

2、select低效是因为轮询,但是低效也是相对的,也可以通过良好的设计改善

Netty简述

Netty的优势

1、API使用简单,开发门槛低;

2、功能强大,预置了多种编解码功能,支持多种主流协议;

3、定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;

4、性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;

5、成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦 恼;

6、社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;

7、经历了大规模的商业应用考验,质量得到验证

为什么不用Netty5

已经停止开发了,其底层的AIO模型,参考了NIO的epoll模型,性能并没有提高很多,而且还会带来很多的异步回调问题。

而且操作系统对AIO的支持不够成熟,处理回调结果速度跟不上处理需求

作者原话: (为什么使用NIO为不是AIO)

Not faster than NIO (epoll) on unix systems (which is true)

There is no daragram suppport

Unnecessary threading model (too much abstraction without usage)

为什么不用Mina

Mina几乎不更新了。Mina也是Netty的作者做出来的,后来作者继续回去做Netty了。

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

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

相关文章

陪诊小程序开发|陪诊软件定制|陪诊系统成品功能包含哪些?

陪诊小程序是一种便捷的工具,为用户提供一系列服务和功能,方便患者在就医过程中获得更好的体验和效果。接下来我们将介绍几个主要的陪诊小程序功能。 陪诊小程序开发功能: 一、预约挂号功能。陪诊小程序能够连接用户和医疗机构的系统&#x…

扩散模型微调方法/文献综述

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

SMD NTC Thermistor NTC热敏电阻产品基本参数定义

热敏电阻器(Thermistor)是一种电阻值对温度极为灵敏的半导体元件,温度系数可分为Positive Temperature Coefficient 正温度系数热敏电阻又称PTC热敏电阻和Negative Temperature Coefficient 负温度系数热敏电阻又称NTC热敏电阻. NTC热敏电…

基于YOLOv8深度学习的苹果叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

外汇天眼:不仅骗钱还骗感情?小心这类骗子盯上你

什么是外汇“杀猪盘”骗局?通俗一点来说就是骗子利用社交平台或者网站,伪造虚假的人设和故事,然后诱导网友进入虚假的外汇平台进行投资交易。随着现代网络科技的发展,各种交友软件可以说是层出不穷,虽然给人们提供了更…

智慧公厕:引领城市卫生管理新时代

在智慧城市建设中,智慧公厕作为城市环境卫生信息化的重要组成部分,扮演着关键角色。它不仅可以提升城市管理水平,满足人民群众的需求,还能提高公厕使用体验和城市环境卫生水平。如广州中期科技有限公司自主研发的智慧公厕管理系统…

Type Script 安装 NPM 安装

使用终端命令 npm -v 这里需要使用到npm npm node.js安装包自带 去官网 Node.js — Download下载对应版本安装 1.npm config set registry https://registry.npmmirror.com 2.npm install -g typescript error: npm notice npm notice New minor version of npm availab…

SpringBoot+Vue实现对称加密和非对称加密

我们先来了解一下什么是对称加密和非对称加密,以及两者的优缺点 对称加密 使用同一个密钥对消息进行加密解密 优点:加密和解密的速度快,适合于数据量大的加解密 缺点:密钥在网络传输中可能被泄露,因此安全性相对较低…

arcgis javascript api4.x以basetilelayer方式加载天地图web墨卡托(wkid:3857)坐标系

需求: arcgis javascript api4.x以basetilelayer方式加载天地图web墨卡托(wkid:3857)坐标系 效果图: 代码: 提示: 2个文件放同一个文件夹下 MyCustomTileLayer.js define([exports, "…

手把手教你学会接口自动化系列十一-将用例写在json中,持久化管理起来下

上一篇我写了登录,我们发现json还是没有什么大问题,还蛮好用的,但是我们再写下一个,比如线索新建接口的时候,我们写着写着会发现问题: 我们写获取url的没有问题,代码如下: # !/usr…

uniapp中uview组件库丰富的ActionSheet 操作菜单使用方法

目录 #平台差异说明 #基本使用 #配置顶部的提示信息和底部取消按钮 #如何知道点了第几项 #API #Props #Event 本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。 本组件功能类似于uni的uni.showActionSheetAPI,配置更加灵活,所…

vue:使用【3.0】:拖拽数据

1、参考链接&#xff1a;vue.draggable中文文档 - itxst.com 2、想要实现的效果图&#xff1a;红框内容可以拖拽 3、安装 yarn add vuedraggablenext npm i -S vuedraggablenext 4、代码 <template><draggable:list"columns"ghost-class"ghost&qu…

手把收来教大家win10电脑分辨率怎么调

win10系统操作界面和方式和win7系统有很大不同&#xff0c;有些用户想要设置屏幕的分辨率&#xff0c;但是却不知道应该怎么操作&#xff1f;屏幕分辨率会影响我们使用电脑的视觉效果&#xff0c;经常使用电脑的朋友通常都会设置一个合适的分辨率。下面小编来教大家win10电脑分…

webpack的性能优化(一)——分包优化

1.什么是分包&#xff1f;为什么要分包&#xff1f; 默认情况下&#xff0c;Webpack 会将所有代码构建成一个单独的包&#xff0c;这在小型项目通常不会有明显的性能问题&#xff0c;但伴随着项目的推进&#xff0c;包体积逐步增长可能会导致应用的响应耗时越来越长。归根结底这…

什么是google算法?

谷歌算法本身指的是谷歌针对搜索引擎做的规定 要想在别人的地盘玩&#xff0c;那肯定要了解这个地盘的规定&#xff0c;不然做了什么违反了规定&#xff0c;谷歌肯定不会让你继续玩下去 要想做谷歌&#xff0c;那肯定要了解谷歌的算法&#xff0c;然而谷歌的算法也不是一成不变…

代码随想录 Leetcode202. 快乐数

题目&#xff1a; 代码(首刷自解 2024年1月15日&#xff09;&#xff1a; class Solution { public:bool isHappy(int n) {unordered_set<int> hash;while(n ! 1) {int sum 0;while(n/10 ! 0) {sum (n % 10)*(n % 10);n/10;}sum n*n;if (hash.find(sum) ! hash.end()…

SQL备忘--集合运算

前言 本文讨论的是两个子查询结果的合并问题&#xff0c; 是行维度下的合并处理 例如子查询A查出5条记录、子查询B查出3条记录&#xff0c;那么将两个结果合并&#xff0c;则共返回8条记录 行维度上要能进行合并&#xff0c;前置要求是&#xff1a;子查询的列字段是相同的&…

关于你不知道的前端文件上传方式

1、原生方法 我们开发中比较常用的有使用 input 属性的 type 设置为 file,这里我们就不进行过多的阐述&#xff0c;已经老生常谈了。 今天我们主要介绍两个新的属性 showDirectoryPicker 和 showOpenFilePicker 这里是官方文档 1、showDirectoryPicker showDirectoryPicker方…

20240115-【UNITY 学习】第一人称移动增加斜坡移动、冲刺和蹲伏功能

直接修改或者替换PlayerMovement_01.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerMovement_02 : MonoBehaviour {private float moveSpeed; // 玩家移动速度public float walkSpeed 7; // 行走速度public float sp…

内网搭建文件服务器

文件下载地址 Releases rejetto/hfs GitHubHFS is a web file server to run on your computer. Share folders or even a single file thanks to the virtual file system. - Releases rejetto/hfshttps://github.com/rejetto/hfs/releases http://192.168.100.33/apk/ 就…