Netty面试经典问题

news2025/1/24 22:43:24

目录

Netty是怎么实现高性能设计的?

简单介绍一下对于Netty的了解

Netty的高性能表现在哪些方面

介绍一下Java中的几种IO模型

一个通俗例子读懂BIO、NIO、AIO

BIO与NIO的区别

Netty的线程模型

什么是零拷贝

Netty中的模块组件:

Netty 中有哪种重要组件?

简单聊聊:Netty的线程模型的三种使用方式? Rectory


Netty 已经有了成百上千的分布式中间件、各种开源项目以及各种商业项目的应用。例如火爆 的 Kafka、RocketMQ 等消息中间件、火热的 ElasticSearch 开源搜索引擎、大数据处理 Hadoop 的 RPC 框架 Avro、主流的分布式通信框架 Dubbo,它们都使用了 Netty。

Netty是怎么实现高性能设计的?

高性能设计的核心: 巧妙的结合高性能IO模型 和 线程模型 ,相得益彰,达到了 高性能 、高吞吐、低延迟、低消耗的目标。

其I/O模型 高性能epoll/select 模型

其 线程模型为 多线程 reactor 反应器模型

简单介绍一下对于Netty的了解

1.Netty 是一个异步的、基于事件驱动的网络应用框架

2.对JDK中的NIO做了增强

3.有很多特点:零拷贝、多种通信协议HTTP/WEBSocker,粘包分包自动化处理等

Netty的高性能表现在哪些方面

1.i/o线程模型:同步非阻塞,用最少的资源做更多的事情

2.内存零拷贝

3.内存池、线程池的设计

介绍一下Java中的几种IO模型

BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。

伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。

NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理

一个通俗例子读懂BIO、NIO、AIO

同步阻塞(blocking-IO)简称BIO
同步非阻塞(non-blocking-IO)简称NIO
异步非阻塞(asynchronous-non-blocking-IO)简称AIO
一个经典生活的例子:

小明去吃同仁四季的椰子鸡,就这样在那里排队,等了一小时,然后才开始吃火锅。(BIO)
小红也去同仁四季的椰子鸡,她一看要等挺久的,于是去逛会商场,每次逛一下,就跑回来看看,是不是轮到她了。于是最后她既购了物,又吃上椰子鸡了。(NIO)
小华一样,去吃椰子鸡,由于他是高级会员,所以店长说,你去商场随便逛会吧,等下有位置,我立马打电话给你。于是小华不用干巴巴坐着等,也不用每过一会儿就跑回来看有没有等到,最后也吃上了美味的椰子鸡(AIO)

BIO与NIO的区别

BIO是面向流的,NIO是面向缓冲区的;

BIO的各种流是阻塞的。而NIO是非阻塞的;

BIO的Stream是单向的,而NIO的channel是双向的。

Netty的线程模型

netty通过Reactor模型基于多路复用器接收并处理用户请求,内部实现了两个线程池,Boss线程池和Work线程池,其中Boss线程池的线程负责处理请求accept事件,当接收到accept事件的请求是,把对应的socket封装到一个channel中,并交给work线程池,其中work线程池负责Read和Write事件,由对应的Handler处理

Netty主要基于主从Reactors多线程模型,做了一定的修改,其中主从Reactor多线程模型有多 个Reactor:MainReactor和SubReactor:

  • MainReactor负责客户端的连接请求,并将请求转交给SubReactor
  • SubReactor负责相应通道的IO读写请求
  • 非IO请求(具体逻辑处理)的任务则会直接写入队列,等待worker threads进行处理

什么是零拷贝

Netty 的零拷贝主要包含三个方面:
1、Nerty 的接收和发送 ByteBuffer采用 DIRECT BUFFERS,使用堆外直接内存Socket
读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS) 进行
Socket读写,JVM会将堆内存Buffer拷贝一次到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。

2、Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小Buufer 合并成一个大的 Buffer。
3、Netty的文件传输采用transferTo 方法,它可以直接将文件缓沖区的数据发送到目标 Channel,避免了传统通过循环 write 方式导致的内存拷贝问题。

Netty中的模块组件:

BootStrap/ServerBootStrap

Future/ChannelFuture

Channel

Selector

EventLoop

Pipline

Netty 中有哪种重要组件?

Channel:Netty 网络操作抽象类,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。

EventLoop:主要是配合 Channel 处理 I/O 操作,用来处理连接的生命周期中所发生的事情。

ChannelFuture:Netty 框架中所有的 I/O 操作都为异步的,因此我们需要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会自动触发返回结果。

ChannelHandler:充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。

ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的。

简单聊聊:Netty的线程模型的三种使用方式? Rectory

单线程模型 :

一个线程需要执行处理所有的 accept、read、decode、process、encode、send 事件。

对于高负载、高并发,并且对性能要求比较高的场景不适用。

对应到 Netty 代码是下面这样的

使用 NioEventLoopGroup 类的无参构造函数设置线程数量的默认值就是 **CPU 核心数 2

//1.eventGroup既用于处理客户端连接,又负责具体的处理。
EventLoopGroup eventGroup = new NioEventLoopGroup(1); 

//2.创建服务端启动引导/辅助类:
ServerBootstrap ServerBootstrap b = new ServerBootstrap(); 
    boobtstrap.group(eventGroup, eventGroup) 
    //......

多线程模型:

一个 Acceptor 线程只负责监听客户端的连接,一个 NIO 线程池负责具体处理:accept、read、

decode、process、encode、send 事件。满足绝大部分应用场景,并发连接量不大的时候没啥问题,但是遇到并发连接大的时候就可能会出现问题,成为性能瓶颈。

对应到 Netty 代码是下面这样的:

// 1.bossGroup 用于接收连接,workerGroup 用于具体的处理 
EventLoopGroup bossGroup = new NioEventLoopGroup(1); 
EventLoopGroup workerGroup = new NioEventLoopGroup(); 
    try { 
        //2.创建服务端启动引导/辅助类:
        ServerBootstrap ServerBootstrap b = new ServerBootstrap(); 
        //3.给引导类配置两大线程组,确定了线程模型 
        b.group(bossGroup, workerGroup) 
            //......

主从多线程模型:

从一个 主线程 NIO 线程池中选择一个线程作为 Acceptor 线程,绑定监听端口,接收客户端连接的连接,其他线程负责后续的接入认证等工作。连接建立完成后,Sub NIO 线程池负责具体处理 I/O 读写。

如果多线程模型无法满足你的需求的时候,可以考虑使用主从多线程模型 。

// 1.bossGroup 用于接收连接,workerGroup 用于具体的处理 
EventLoopGroup bossGroup = new NioEventLoopGroup(); 
EventLoopGroup workerGroup = new NioEventLoopGroup();
    try { 
        //2.创建服务端启动引导/辅助类:
        ServerBootstrap ServerBootstrap b = new ServerBootstrap(); 
        //3.给引导类配置两大线程组,确定了线程模型 
        b.group(bossGroup, workerGroup) 
            //......

未完待续~ 

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

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

相关文章

Linux rpm方式安装 MYSQL8.0

1.卸载原有的mysql 数据库 1)查找安装的mysql软件包和依赖包: rpm -pa | grep mysql 显示结果: mysql80-community-release-el7-1.noarch mysql-community-server-8.0.11-1.el7.x86_64 mysql-community-common-8.0.11-1.el7.x86_64 mysql…

ReLU,Sigmoid,Tanh,softmax【基础知识总结】

一、ReLU(Rectified Linear Activation Function)1、优点2、缺点补充二、Sigmoid1、优点2、缺点三、Tanh四、Sigmoid 和 Tanh 激活函数的局限性五、softmax(待补充)激活函数的引入是为了增加神经网络模型的非线性,没有…

【机器学习入门项目10例】(九):聚类算法用于降维,KMeans的矢量量化应用(图片压缩)

🌠 『精品学习专栏导航帖』 🐳最适合入门的100个深度学习实战项目🐳🐙【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码🐙🐶【机器学习入门项目10例目录】项目详解 + 数据集 + 完整源码🐶🦜【机器学习项目实战10例目录】项目详解 + 数据集 +

万字长文!对比分析了多款存储方案,KeeWiDB最终选择自己来

大数据时代,无人不知Google的“三驾马车”。“三驾马车”指的是Google发布的三篇论文,介绍了Google在大规模数据存储与计算方向的工程实践,奠定了业界大规模分布式存储系统的理论基础,如今市场上流行的几款国产数据库都有参考这三…

Fama-French三因子和五因子模型和Stata代码(内附原始数据)

一、Fama-French三因子模型数据和Stata代码(2000-2020年) 1、数据来源:原始数据在分享文件中 2、时间跨度:2000-2020年 3、区域范围:全国 5、原始数据: 4、指标说明: 部分指标如下&#xff…

Linux虚拟机的克隆

文章目录🚏 Linux虚拟机的克隆🚀 克隆虚拟机🚬 1、虚拟机在未开启的状态下🚬 2、选择创建完整克隆🚬 3、选择虚拟机的名称和位置🚄 修改 克隆虚拟机的设置🚬 1、mac地址🚬 2、主机名…

RocketMQ安装部署

RocketMQ的物理部署结构图如下: Producer和Consumer对应的是我们的应用程序,多个NameServer实例组成集群,但相互独立,没有信息交换,所以对于NameServer来说部署两个或两个以上即可保证高可用,对于Broker来…

AWS Skill Builder - 练习 ACF 认证的第一站

AWS Skill Builder - 练习 ACF 认证的第一站 AWS Skill Builder https://explore.skillbuilder.aws/learn 是 AWS 针对要想要自学 AWS 云计算技术所提供的网站,里面提了很多自学的课程,今天要展示的是在学习完 AWS Academy Cloud Foundations 课程后&am…

车牌识别停车场智能管理系统

摘 要 本论文主要论述了如何使用JSP技术开发一个车牌识别停车场智能管理系统 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述车牌识别停车场智能管理系统的…

【Paraview教程】第一章安装与基础介绍

1 Paraview介绍 1.1基本介绍 ParaView是一个开源的,跨平台的数据处理和可视化程序。ParaView用户可以迅速的建立起可视化环境利用定量或者是定性的手段去分析数据。利用它的批量处理能力可以在三维空间内在工具栏和展示界面中进行交互操作,从而实现“数…

PDF中的某个图或表想几乎无损的插入ppt或者word里的方法

要使用ps打开pdf并另存为tiff或者,其他方法存储的tiff可能不如这种方法高清 0. 参考方法网址:PS导出符合投稿规范的图片 1. pdf可能很多页,一页内有很多图像文字,要先使用福昕阅读器(破解版本的)裁剪到想保留tiff的那张图或那个表…

四、nginx反向代理

一、反向代理 解释:nginx反向代理如正向代理原理类似,只是实现了不同的功能。客户端将请求发给服务端(代理服务器)后,服务端(代理服务器)并没有自己处理请求,而是交给被代理服务器&…

P4用软件实现和硬件实现的区别

摘要:我们目前看到从可配置性有限的固定功能网络设备向具有完全可编程处理流水线的网络设备的转变。这种发展的一个突出例子是P4,它提供了一种语言和参考架构模型来设计和编程网络设备。这个参考模型的核心元素是可编程匹配动作表,它定义了网…

[附源码]Python计算机毕业设计高校餐厅评价系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Java多线程编程【一文全解】

文章目录01 线程简介02 进程的创建> 继承 Thread 类> 实现 Runnable 接口> 实现 Callable 接口※ Lambda表达式 λ※ 静态代理模式03 线程状态04 线程方法> 停止线程 stop( )> 线程休眠 sleep( )> 线程礼让 yield( )> 线程强行执行 join( )> 线程状态观…

【疑难攻关】——XXE漏洞快速入门

作者名:Demo不是emo 主页面链接:主页传送门创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

Redis快速上手神册,17W字详解其实Redis也就那么一回事!

开始使用Redis Redis是一个开源的数据库,经常被用来构建高性能的可扩展网络应用。它使用内存数据库,这使得它比其他数据库更快。 Redis用于我们的应用程序中的短期数据。它经常被用于会话或网页头数。 通过使用内存数据库,我们不需要有大的…

表空间的空间管理算法

存储结构 逻辑结构 物理结构 database tablespace --> datafile segment extent oracle --> os block block 表空间的空间管理: DMT(dictionary management tablespace): LMT(local management tablespace): SQL>…

[计算机毕业设计]远程监督的跨语言实体关系抽取

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

代码随想录算法训练营day57 | 647. 回文子串,516.最长回文子序列

647. 回文子串: 暴力解法:两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。时间复杂度:O(n^3). Output Limit Exceeded class Solution:#时间复杂度:O(n^3)def countSubstrings(self, s: s…