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

目录

用三点来简单的介绍下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.rhkb.cn/news/177512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XUbuntu22.04之simplenote支持的Markdown语法总结(一百九十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

linux下df -h 命令一直卡住的解决方法

在Linux中,偶尔遇到用 df -h 查看磁盘情况时,一直卡住无法显示结果。 解决方法: 1、首先使用strace追踪到底执行到哪里卡住 $ strace df -h 2、如果没有strace命令则进行安装 $ yum install strace -y 3、显示出卡住的地方,如…

SpringBoot源码透彻解析—bean生命周期

先跟一段debug再看总结: 1 创建实例 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(自定义一个对象或者代理对象)createBeanInstance(创建实例)MergedBeanDefinitionPostProcessor.postProcess…

编程怎么学才高效?初学编程怎么样才容易入门?

学习编程并提高编程能力需要一种结构化的方法,其中包括理解基础概念、实践、反馈和持续学习。以下是一些高效学习编程的策略: 理解基础概念:在学习编程的初期,理解基础概念非常重要。这包括学习编程语言的基本语法、数据类型、控…

Java调用HTTPS接口,绕过SSL认证

1:说明 网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。 Java调…

算法与数据结构-分治算法

文章目录 什么是分治算法分治算法应用举例分析分治思想在海量数据处理中的应用 什么是分治算法 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问…

JavaEE入门介绍,HTTP协议介绍,常用状态码及含义,服务器介绍(软件服务器、云服务器)

一、JavaEE入门 JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发(不需要使用控制台)平台。最早由Sun公司定制并发布,后由Oracle负责维护。 JavaEE平台规范了在开发企业级w…

3D RPG Course | Core 学习日记三:Navigation智能导航地图烘焙

前言 前面我们已经绘制好了一个简单的地图场景,现在我们需要使用Navigation给地图做智能导航,以实现AI自动寻路,以及设置地图的可行走区域以及不可行走区域,Navigation的基础知识、原理、用法在Unity的官方文档,以及网…

cocos creator,vscode打开脚本报错,找不到cc模块问题

cocosCreator,用VSCODE打开写脚本代码的时候,会误报飘红,但实际上能正常运行。 我的版本是当前最新版本的3.8.1 解决方案: 在CocosCreator 的安装目录下 C:\ProgramData\cocos\editors\Creator\3.8.1\resources\resources\3d\engine\bin.dec…

人工智能AI 全栈体系(十一)

第一章 神经网络是如何实现的 这些神经网络越来越复杂,都是用BP算法求解。网络有些变化就可能需要重新推导,而在实验过程中可能会做很多尝试,这样每次都重新推导BP算法太麻烦了。 十、深度学习框架 现在有了很多深度学习框架,这…

OPENCV 闭运算实验示例代码morphologyEx()函数

void CrelaxMyFriendDlg::OnBnClickedOk() {hdc this->GetDC()->GetSafeHdc();// TODO: 在此添加控件通知处理程序代码string imAddr "c:/Users/actorsun/Pictures/";string imAddr1 imAddr"rice.png";Mat relax, positive;relax imread(imAddr1…

【机器学习】二、决策树

目录 一、决策树定义: 二、决策树特征选择 2.1 特征选择问题 2.2 信息增益 2.2.1 熵 2.2.2 信息增益 三、决策树的生成 3.1 ID3算法 3.1.1理论推导 3.1.2代码实现 3.2 C4.5 算法 3.2.1理论推导 ​ 3.2.2代码实现 四、决策树的剪枝 4.1 原理 4.2 算法思路&#xff1a…

css position属性与js滚动

“视口”就是浏览器窗口中实际显示文档内容的区域,不包含浏览器的“外框”,如菜单、工具条和标签。文档则是指整个网页。 1 css 的position static 正常定位,是元素position属性的默认值,元素遵循常规流。 relative 相对定位&…

如何卸载干净 IDEA(图文讲解)windows和Mac教程

大家好,我是sun~ 很多小伙伴会问 Windows / Mac 系统上要怎么彻底卸载 IDEA 呢? 本文通过图片文字,详细讲解具体步骤: 如何卸载干净 IDEA(图文讲解) Windows1、卸载 IDEA 程序2、注册表清理3、残留清理 M…

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置: 容器危险挂载(挂载procfs,Scoket) 特权模式启动的提权(privileged) 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客,下…

查询平均提速 700%,奇安信基于 Apache Doris 升级日志安全分析系统

本文导读: 数智时代的到来使网络安全成为了不可忽视的重要领域。奇安信作为一家领先的网络安全解决方案领军者,致力于为企业提供先进全面的网络安全保护,其日志分析系统在网络安全中发挥着关键作用,通过对运行日志数据的深入分析…

Go的命令行工具开发:使用Cobra库

今天我们将深入探讨如何使用Go语言和Cobra库来开发命令行工具。 命令行工具在软件开发中有着广泛的应用,它们快速、高效,且易于自动化。 Go语言因其简洁、高效而被广泛用于命令行工具的开发。Cobra库则是Go中用于构建命令行工具的重要库之一。 为什么选…

C/C++ sizeof

介绍 sizeof 是一个关键字、操作符,也是一个编译时运算符 作用:返回一个对象或者类型所占的内存字节数 使用方法 sizeof(type_name);//sizeof(类型) sizeof(object);//sizeof(对象) 注意: sizeof 操作符不能用于函数类型,不…

MyBatis-Plus返回getOne返回null疑惑

getOne返回null 问题描述分析过程总结 问题描述 在数据库建了一张表主要包括两个字段master_id和slave_id;主要的额外字段max_lots 默认值是null; 当调用getOne进行查询结果是null,但实际情况是数据库时应该返回值的; AotfxMasterSlave ex…

【Unity】Addressables资源管理笔记

【Unity】Addressables资源管理笔记 Addressables是一种用于管理资源的系统。允许以一种灵活的方式加载、卸载和管理资源,无论是场景、预制件、材质、纹理、音频剪辑等。 一、快速实现 安装Addressables插件 把对象添加到组 1)打开AddressablesGroups面…