大厂面试题-介绍一下自己对Netty

news2025/2/25 9:30:55

目录

用三点来简单的介绍下Netty:

面试官:哦,还不错,那你在说说为什么要用Netty?

面试官:那你在通俗地说一下Netty可以做什么事情?

面试官:那,在说说Netty有几种线程模型吧?

这是最基本的单Reactor单线程模型

多线程单Reactor模型        

多线程多Reactor模型


三点来简单的介绍下Netty

  1. 第一:Netty是一个基于NIO模型的高性能网络通信框架,其实可以认为它是对NIO网络模。型的封装,提供了简单易用的API,我们可以利用这些封装好的API快速开发自己的网络程序。
  2. 第二:Netty在NIO的基础上做了很多优化,比如零拷贝机制、高性能无锁队列、内存池等,因此性能会比NIO更高。
  3. 第三:Netty可以支持多种通信协议,如Http、WebSocket等,并且针对数据通信的拆包黏包问题,Netty内置了拆包策略。

面试官:哦,还不错,那你在说说为什么要用Netty?

Netty相比于直接使用JDK自带的NIO相关的API来说更加易用。同时,它还具有以下特点:

1.统一的API,支持多种传输类型,如阻塞、非阻塞,以及epoll、poll等模型。

2.我们可以使用非常少的代码来实现,多线程Reactor模型以及主从多线程Reactor模

3.自带编解码器解决TCP粘包/拆包问题。

4.自带各种协议栈。

5.比直接使用Java库中的NIOAPI有更高的吞吐量、更低的延迟、更低的资源消耗和更少的内存复制。

6.安全性不错 ,有完整的SSL/TLS以及StartTLS支持。

7.社区活跃成熟稳定,经历了大型项目的使用和考验,而且很多开源项目都使用到了Netty,比如我们经常接触的Dubbo、RocketMQ等等。

试官:那你在通俗地说一下Netty可以做什么事情?

我们之所以要用Netty,核心点还是在于解决服务器如何承载更多的用户同时访问的问

传统的BIO模型,由于阻塞的特性,使得在高并发场景中,很难获得更高的吞吐量。而后来基于NIO的多复用模型虽然在阻塞方面进行了优化,但是它的API使用比较复杂,对于初学者来说使用不是很友好。而Netty是基于NIO的封装,提供了成熟且易用的API,降低了使用成本和学习成本。

本质上来说,Netty和NIO所扮演的角色是相同的,都是为了提升服务端的吞吐量,让用户获得更好的产品体验。

另外,Netty这个中间件经过很多年的验证,在目前主流的中间件如Zookeeper、Dubbo、RocketMQ中都有应用。

面试Netty核心组件了解吗?分别有什么作用?

手:Netty由三层结构构成:网络通信层、事件调度器与服务编排层

在网络通信层有三个核心组件:Bootstrap、Server Boot Strap、Channel

  1. Bootstrap负责客户端启动并用来链接远程netty server
  2. Server Boot Strap负责服务端监听,用来监听指定端口,
  3. Channel是负责网络通信的载体

调度器有两个核心组件:EventLoopGroupEventLoop

  1. EventLoopGroup本质上是一个线程池,主要负责接收I/O请求,并分配线程执
  2. 行处理请求
  3. EventLoop相当于线程池中的线程

在服务编排层有三个核心组件ChannelPipeline、ChannelHandler、ChannelHandlerContext

  1. ChannelPipeline负责将多个Channelhandler链接在一起
  2. ChannelHandler针对IO数据的处理器,数据接收后,通过指定的Handler进行处理。
  3. ChannelHandlerContext用来保存ChannelHandler的上下文信息

面试官:那,在说说Netty有几种线程模型吧?

高手Netty提供了三种Reactor模型的支持

  1. 单线程单Reactor模型
  2. 多线程单Reactor模型
  3. 多线程多Reactor模型

官:你说一下对于这三种线程Reactor模型的理解?

高手:Reactor模型有三个重要的组件

1. Reactor:将I/O事件发派给对应的Handler

2.Acceptor:处理客户端连接请求

3.Handlers:执行非阻塞读/写

这是最基本的Reactor单线程模型

我们来看这张图:

其中Reactor线程,负责多分离套接字,有新连接到来触发connect事件之后,交Acceptor行处理,有IO读写事件之后交给hanlder处理。

Acceptor主要任务就是构建handler,在获取到和client相关的SocketChannel之后,绑定到相应的hanlder上,对应的SocketChannel有读写事件之后,基于reactor分发,hanlder就可以处理了(所有的IO事件都绑定到selector上,有Reactor分发)

多线程单Reactor模型        

单线程Reactor种实现方式有存在着缺点,从实例代码中可以看出,handler的执行是串行的,如果其中一个handler处理线程阻塞将导致其他的业务处理阻塞。由于handlerreactor同一个线程中的执行,这也将导致无法接收新的请求。

为了解决这种问题,有人提出使用多线程的方式来处理业务,也就是在业务处理的地方加入线程池异步处理,将reactorhandler在不同的线程来执行,这就是多线程单Reactor型。

多线Reactor模型

在多线程单Reactor模型中,有的I/O操作是由一个Reactor来完成,而Reactor运行在单个线程中,它需要处理包括Accept()/read()/write/connect操作,对于小容量的场景,影响不大。但是对于高负载、大并发或大数据量的应用场景时,容易成为瓶,主要原因如下:

  1. 一个NIO线程同时处理成百上千的链路,性能上无法支撑,即便NIO线程的CPU负荷达到100%,也无法满足海量消息的读取和发送;
  2. 当NIO线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重了NIO线程的负载,最终会导致大量消息积压和处理超时,成为系统的性能瓶颈;所以,我们还可以更进一步优化,引入多Reactor多线程模式

  3. Main Reactor负责接收客户端的连接请求,然后把接收到的请求传递给Sub Reactor(其中subReactor可以有多个),具体的业务IO处理由SubReactor完成。
  4. Acceptor,请求接收者,在实践时其职责类似服务器,并不真正负责连接请求的建立,而只将其请求委托Main Reactor线程池来实现,起到一个转发的作用。
  5. Main Reactor,主Reactor线程组,主要负责连接事件,并将IO读写请求转发到SubReactor线程池。

Sub Reactor,Main Reactor通常监听客户端连接后会将通道的读写转发到Sub Reactor线程池中一个线程(负载均衡),负责数据的读写。在NIO中通常注册通道的读(OP_READ)、写事件(OP_WRITE)。

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

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

相关文章

(一)、ts 基础类型 及class类举例字符雨和实现vue的挂在#app

文章目录 前言环境执行依赖node.js一、基础数据类型二、任意类型三、接口和对象类型四、 数组类型五、函数重载六、类型断言断言联合类型交叉类型 七、内置对象-Promise基础对象DOM和BOMPromise ts化代码雨案例 八、Class类(派生类和抽象类)派生类 abstract抽象类 classClass简…

彻底解决使用better-scroll页面不能滚动的问题

better-scroll这个组件不能说有多好,只能说可以拿来用用。但是很多人都碰到了引入这个组件以后,页面反而不能滚动的问题。今天我就来谈谈怎么彻底解决这个问题 首先要谈谈better-scroll页面滚动的原理: 如上图所示,只有当内容高度…

Mac终端学习

命令1:ifconfig 作用:列出本机所有的网络设备以及其上面的配置,主要指的是ip地址和mac地址 其他用法:sudo ifconfig en4 add 10.10.10.12 netmask 255.255.255.0 作用:给en4加入别的网段 其他用法:sudo i…

在跑腿App系统开发中,如何构建系统架构?

1. 前后端分离架构 在跑腿App系统的构建中,采用前后端分离的架构是常见的做法。这意味着前端和后端是独立开发和部署的,它们通过API进行通信。常见的技术栈包括: 前端:使用框架如React、Vue.js,可能还有HTML、CSS、J…

@echo off 的作用

echo off 的作用 表示关闭批处理文件自身的回显,即执行此句之后的命令不会显示出来,只有输出结果会被显示 整体的理解就是 执行的命令不显示了,显示执行命令后的结果 其中, 表示关闭命令回显功能,即命令执行时不在…

MySQL(刷题)

1. 175组合两个表 左外连接 Q: 表: Person---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主键&#…

论文翻译-ImageNet Classification with Deep Convolutional Neural Networks

[toc] 前言 AlexNet是是引领深度学习浪潮的开山之作,即使是我们现在进入了ChatGPT时代,这篇论文依然具有一定的借鉴意义。AlexNet的作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的学生。网上流行说 Hinton、LeCun和Bengio是神经网…

Netty(一)Netty简介与Java的IO模型

Netty(一)Netty简介与Java的IO模型 1 Netty简介与应用场景 ​ Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。 Netty是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络IO程序Nett…

Spring底层原理(四)

Spring底层原理(四) 本章内容 模拟实现Spring中的几个常见BeanFactory后置处理器 常见的BeanFactory后置处理器 GenericApplicationContext context new GenericApplicationContext(); context.registerBean("config",Config.class); context.registerBean(Conf…

算法通过村第十八关-回溯|青铜笔记|什么叫回溯(中篇)

文章目录 前言回溯的核心问题撤销操作解释总结 前言 提示:阳光好的时候,会感觉还可以活很久,甚至可以活出喜悦。 --余秀华 回溯是非常重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题(这里埋个坑💣…

LED显示屏的4种连接方式

全彩LED显示屏是由多块LED模组拼接起来的LED大屏幕,而显示屏模组是由许多的LED灯珠组装起来的。LED显示屏效果好不好,和LED显示屏组装有很大的关系。而显示屏的组装关键在连接方式上,如果连接不好将影响LED显示屏的画面质量,甚至会…

Arduino开发

文章目录 Arduino IDE 的使用1. 使能编译以及烧录的LOG:2. 下载配置3. 下载 Arduino指令程序下载步骤通过下载器下载通过串口下载 关于Arduino IDE工程生成的二进制文件对比Tools-->burn bootloader 和 ArduinoISP例程 的区别自带例程 Arduino IDE 的使用 1. 使…

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库,它使用图形模型来存储数据,并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库,本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…

2023最新全国拉新app推广接单平台合集 地推网推项目平台渠道

平台 ”聚量推客“ 服务商直营的拉新平台 数据和结算都有保障 地推平台承上启下,对上承接甲方项目,对下对接渠道,方便甲方放单又方便渠道统一接单 以下是全国国内十大地推拉新app推广接单平台分享,2023最新全国拉新app推广接单平…

cec2017(MATLAB):星雀优化算法(Nutcracker optimizer algorithm,NOA)

一、星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出,该算法模拟星雀的两种行为,即:在夏秋季节收集并储存食物,在春冬季节搜索食物的存储位置。星雀优化算法(Nutcrack…

C++ Qt 学习(一):Qt 入门

Qt6 安装教程 0. 基础知识 0.1 qmake 和 cmake 对比 qmake:qt 独有的代码构建工具cmake:C 通用的代码构建工具,绝大部分 C 开源项目都使用 cmake 管理代码qt 项目,没有特殊要求,使用 qmake 即可 0.2 Qt 3 个窗口类的…

代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树

目录 前言 LeetCode T343 整数拆分 题目思路: 第一步:确定递归数组含义 第三步:初始化dp数组(其实也是为接下来的递推做准备) 第四步:确定遍历顺序(很多情况下是对遍历顺序有要求的) 第五步:打印dp数组(如果遇到错误可以打印一下dp数组看看和我们推理的dp数组有啥不同,错…

0基础学习PyFlink——使用DataStream进行字数统计

大纲 sourceMapSplittingMapping ReduceKeyingReducing 完整代码结构参考资料 在《0基础学习PyFlink——模拟Hadoop流程》一文中,我们看到Hadoop在处理大数据时的MapReduce过程。 本节介绍的DataStream API,则使用了类似的结构。 source 为了方便&…

OSPF高级特性

OSPF高级特性(1) 一、OSPF不规则区域类型 产生原因:区域划分不合理,导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果:非骨干区域没和骨干区域相连,导致ABR将不会帮忙转发区域间的路由信息。非骨干区…

MS3142电机驱动器可兼容LV8548M

MS3142/MS3142S 是一个双全桥电机驱动。可兼容LV8548M(功能基本一致,管脚不兼容)。电源电压供电范围 4V 到 18V,平均电流 1.1A,电流峰值 1.54A。如果需要更高的电流能力,可以将双全桥并联使用。 四个输入脚…