[Netty] 面试问题 1 (十八)

news2024/10/5 16:30:17

文章目录

      • 1.Netty的特点
      • 2.Netty应用场景
      • 3. Netty核心组件
      • 4.Netty的线程模型
      • 5. EventloopGroup和EventLoop
      • 6.Netty 的零拷贝
      • 7.Netty 长连接和心跳机制
      • 8.Netty 服务端和客户端的启动过程
      • 9.Netty 的 Channel 和 EventLoop
      • 10.Netty 的 ChannelPipeline
      • 11.Netty 中的 ByteBuf
      • 12.Netty 高性能表现
      • 13.Netty 和 Tomcat 的区别
      • 14.I/O模型
      • 15.TCP 粘包/拆包的原因及解决方法
      • 16.序列化协议

1.Netty的特点

在这里插入图片描述

Netty是一个高性能, 异步事件驱动的网络编程框架, 基于Nio, 提供了简单易用的Api, 用于构建各种类型的网络应用程序。

高性能: Netty使用异步I/O, 非阻塞处理方式, 可处理大量并发连接, 提高系统性能。
易于使用: Netty提供了高度抽象的Api, 可以快速构建各种类型的网络应用程序, web服务, 消息推送, 实时游戏
灵活可扩展: Netty提供了许多可插拔的组件, 可以自由组合。

2.Netty应用场景

在这里插入图片描述

服务器间高性能通信: RPC, HTTP, WebSocket协议的实现
分布式系统的消息传输: Kafka等MQ
游戏服务器: 支持高并发的游戏服务端开发
实时流数据的处理: 音频处理, 实时数据传输

阿里分布式服务框架 Dubbo, RocketMQ使用 Netty 作为通讯的基础

3. Netty核心组件

在这里插入图片描述

4.Netty的线程模型

Netty的线程模型是基于事件驱动的Reactor模型, 它使用少量的线程来处理大量的连接和数据传输, 以提高性能和吞吐量。

在Netty中, 每个连接都分配了一个单独的EventLoop线程, 该线程负责处理所有与该连接相关的事件, 包括数据传输、握手和关闭等。

多个连接可以共享同一个EventLoop线程, 从而减少线程的创建和销毁开销,提高资源利用率。

Netty提供了一些线程模型和线程池配置选项, 可以使用不同的EventLoopGroup实现不同的线程模型, 如单线程模型、多线程模型和主从线程模型等。

还可以设置不同的线程池参数, 如线程数、任务队列大小、线程优先级等, 以调整线程池的工作负载和性能表现。

还可以通过优化网络协议、数据结构、业务逻辑等方面来提高Netty的性能。例如可以使用零拷贝技术避免数据拷贝, 使用内存池减少内存分配和回收的开销, 避免使用阻塞IO和同步操作。

5. EventloopGroup和EventLoop

EventLoopGroup和EventLoop是 Netty 中两个重要的组件。EventLoopGroup 表示一组EventLoop, 它们共同负责处理客户端连接的I/O 事件。

EventLoop 是 Netty 中的一个核心组件, 代表不断循环的 I/O 线程。负责处理一个或多个 Channel 的 I/O 操作, 比如数据的读取, 写入和状态的更改。一个EventLoop可以处理多个 Channel, 一个Channel只会被一个 EventLoop 所处理。

一个应用程序通常会创建两个 EventLoopGroup, 一个用于处理客户端连接, 一个用于处理服务端连接, 当客户端连接到服务器时, 服务端的EventLoopGroup 会将连接分配给一个EventLoop 处理, 以保证所有IO操作得到及时的处理。

6.Netty 的零拷贝

Netty 通过使用 Direct Memory 和 FileChannel 的方式实现零拷贝。

当应用程序将数据写入 Channel 时, Netty 会将数据直接写入到内存缓冲区中, 然后通过操作系统提供的 sendfile 或者 writev 等零拷贝技术, 将数据从内存缓冲区中传输到网络中, 避免中间的多次拷贝操作。当应用程序从 Channel 中读取数据时, Netty 也会将数据直接读取到内存缓冲区中, 然后通过零拷贝技术将数据从内存缓冲区传输到用户空间。

通过零拷贝技术, Netty 可以避免在数据传输过程中对数据进行多次的拷贝操作, 提高了数据传输的效率。

7.Netty 长连接和心跳机制

长连接可以避免频繁建立和关闭连接的开销, Netty 提供了一种长连接的实现方式, Channel的keepalive选项保持连接的状态, 启动Keepalive选项后, 客户端和服务器之间的连接将会自动保持一段时间, 如果在这段时间内没有数据交换, 关闭连接。

Netty 还提供了一种心跳机制来保持连接的状态, 心跳机制可以通过定期向对方发送心跳消息去检测连接是否正常。Netty 提供了一个 IdleStateHandler 类, 实现心态机制, IdleStateHandler 可以设置多个超时时间, 当连接空闲时间超过设定的时间时, 触发事件, 在事件处理方法中进行相应的处理, 比如发送心跳消息。

通过使用长连接和心跳机制, 保证客户端与服务器之间的连接处于正常的状态, 提高了数据传输的效率和性能。

8.Netty 服务端和客户端的启动过程

在这里插入图片描述

  1. 创建 EventLoopGroup 对象, 用于管理和调度事件的处理。通过 EventLoopGroup 创建多个 EventLoop, 并将每个 EventLoop 与一个线程绑定。服务端, 一般会创建两个 EventLoopGroup 对象, 用于接收客户端的连接请求和处理客户端的数据。
  2. 创建 ServerBootstrap 或 Bootstrap 对象。ServerBootstrap 和 Bootstrap 是 Netty 提供的服务端和客户端启动器, 它们封装了启动过程中的各种参数和配置, 在创建 ServerBootstrap 或 Bootstrap 对象时, 需要指定相应的 EventLoopGroup 对象, 并进行一些基本的配置, 比如传输协议、端口号、处理器。
  3. 配置Channel的参数, 比如传输协议、缓冲区大小、心跳检测等。
  4. 绑定 ChannelHandler, ChannelHandler 是用于处理事件的组件, 它可以处理客户端的连接请求、接收客户端的数据、发送数据给客户端等。需要将 ChannelHandler 绑定到相应的 Channel 上。
  5. 启动服务端或客户端, 进行一些基本的初始化, 比如注册监听器, 绑定端口。

9.Netty 的 Channel 和 EventLoop

Channel代表一个开放的网络连接, 可以用来读取和写入数据, EventLoop则代表一个执行任务的线程, 负责处理Channel上所有的事件和操作。

每个Channel都与一个EventLoop关联, 而一个EventLoop可以关联多个Channel。当一个Channel 有事件发生时, 比如数据读写, 会将事件提交给关联的EventLoop 处理。EventLoop会将该事件加入到它自己的任务队列中, 顺序处理队列的任务。

一个EventLoop实例可能会被多个Channel所共享, 因此它需要能够处理多个Channel上的事件, 并确保在处理每个Channel的事件时不会被阻塞。为此, Netty 采用了事件循环模型, 通过异步IO和事件驱动方式, 实现了高效, 可扩展的网络编程。

10.Netty 的 ChannelPipeline

Netty中, 每个Channel都有一个与之关联的ChannelPipeline, 用于处理该Channel上的事件和请求。ChannelPipeline是一种基于事件驱动的处理机制, 它由多个处理器(Handler)组成, 每个处理器负责处理一个或多个事件类型, 将事件转换为下一个处理器所需的数据格式。

当一个事件被触发时, 从第一个处理器 InboundHandler 开始流经所有的处理器, 直到到达最后一个处理器或者被中途拦截, 通过抛出异常或调用ChannelHandlerContext.fireXXX()方法实现。

  1. 入站(Inbound)事件:由Channel接收到的事件,例如读取到新的数据、连接建立完成等等。入站事件将从ChannelPipeline的第一个InboundHandler开始流动,直到最后一个InboundHandler。
  2. 出站(Outbound)事件:由Channel发送出去的事件,例如向对端发送数据、关闭连接等等。出站事件将从ChannelPipeline的最后一个OutboundHandler开始流动,直到第一个OutboundHandler。
  3. ChannelHandlerContext:表示处理器和ChannelPipeline之间的关联关系。每个ChannelHandler都有一个ChannelHandlerContext,通过该对象可以实现在ChannelPipeline中的事件流中向前或向后传递事件,也可以通过该对象访问Channel、ChannelPipeline和其他ChannelHandler等。

通过使用ChannelPipeline,Netty实现了高度可配置和可扩展的网络通信模型,使得开发人员可以根据自己的需求选择和组合不同的处理器,以构建出高效、稳定、安全的网络通信系统。

11.Netty 中的 ByteBuf

Netty 的 ByteBuf 是一个可扩展的字节容器

在这里插入图片描述
容量可扩展:ByteBuf的容量可以动态扩展,而 ByteBuffer 的容量是固定的。
内存分配:ByteBuf 内部采用了内存池的方式,可以有效地减少内存分配和释放的开销。
读写操作:ByteBuf 提供了多个读写指针,可以方便地读写字节数据。
零拷贝:ByteBuf 支持零拷贝技术,可以减少数据复制的次数。

12.Netty 高性能表现

  • IO 线程模型: 通过多线程Reactor反应器模式, 在应用层实现异步非阻塞(异步事件驱动)架构, 用最少的资源做更多的事。
  • 内存零拷贝: 尽量减少不必要的内存拷贝, 实现了高效的传输。
  • 内存池设计: 申请的内存可以重用, 指的是直接内存, PooledByteBufAllocator
  • 对象池设计: Recycler, Java对象可以重用, 指Minior GC非常频繁的对象, 如ByteBuffer。对象池使用无锁架构, 和FastThreadLocal
  • mpsc无锁编程: 串形化处理读写, 避免使用锁带来的性能开销。
  • 高性能序列化协议: 支持 protobuf 等高性能序列化协议。

13.Netty 和 Tomcat 的区别

  1. 作用不同: Tomcat 是 Servlet 容器, 可以作为web 服务器, 而Netty 是异步事件驱动的网络应用程序框架和工具用于简化网络编程, 例如TCP和UDP套接字服务器。
  2. 协议不同: Tomcat 是基于 http 协议的 Web 服务器, 而 Netty 能通过编程自定义各种协议, 因为 Netty 本身自己能编码/解码字节流, 所有 Netty 可以实现: HTTP 服务器、FTP 服务器、UDP 服务器、RPC 服务器、WebSocket 服务器、Redis 的 Proxy 服务器、MySQL 的 Proxy 服务器等等。

14.I/O模型

  1. 阻塞I/O: 传统阻塞型I/O(BIO)
    在这里插入图片描述

  2. I/O复用模型
    在这里插入图片描述

  3. Netty的非阻塞I/O的实现关键是基于I/O复用模型
    在这里插入图片描述

15.TCP 粘包/拆包的原因及解决方法

TCP是以流的方式来处理数据

在这里插入图片描述

应用层协议, 比如HTTP协议、DNS协议、FTP协议、POP3协议等。
传输层包含两个协议, TCP和UDP, 指定端口号。
网络层包括ARP协议、IP协议、ICMP协议、IGMP协议等等。
以太网, 每个以太网帧最小64字节, 最大为1500字节。

16.序列化协议

序列化(编码)是将对象序列化为二进制形式(字节数组), 主要用于网络传输、数据持久化等, 而反序列化(解码)则是将从网络、磁盘等读取的字节数组还原成原始对象, 主要用于网络传输对象的解码, 以便完成远程调用。

影响序列化性能的因素: 序列化后的码流大小(网络带宽的占用)、序列化的性能(CPU资源占用)、是否支持跨语言(异构系统的对接和开发语言切换)。

Java默认提供的序列化, 无法跨语言, 序列化后的码流比较大, 序列化性能差

  1. XML: 序列化数据只包含数据本身以及类的结构, 不包括公共属性和字段, 不可以序列化方法, 文件大, 格式复杂, 传输占带宽。
  2. JSON: 是一种轻量级的数据交换格式。
  3. FastJson: 采用一种“假定有序快速匹配”的算法。
  4. Thrift: 不仅是序列化协议, 还是RPC框架。
  5. Avro: Hadoop的一个子项目, 解决了JSON的冗长和没有IDL的问题。
  6. ProtoBuf: 将数据结构以.proto文件进行描述, 通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。
    序列化后码流小, 性能高, 结构化数据存储格式 XML JSON, 通过标识字段的顺序, 实现协议的向前兼容, 结构化的文档更容易管理和维护。
  7. ProtoStuff: 基于protobuf协议, 不需要配置proto文件, 直接导包即可。
  8. Jboss marshaling: 可以直接序列化java类, 无需实现java.io.Serializable接口
  9. Message pack: 一个高效的二进制序列化格式
  10. Hessian: 采用二进制协议的轻量级remoting onhttp工具
  11. Kryo: 基于protobuf协议, 只支持java语言, 需要注册(Registration)然后序列化和反序列化。

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

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

相关文章

数据分析01——Anaconda安装/Anaconda中的pip换源/jupyter配置

0、前言: 数据分析三大模块知识:numpy(数组计算)、pandas(基于numpy开发,用于数据清洗和数据分析)、matplotlib(实现数据可视化) 1、Anaconda安装: 安装Ana…

Spring常见面试题总结(2023最新版)

文章目录 1、谈谈你对Spring的理解?1.1 发展历程1.2 Spirng的组成1.3 Spring的好处 2、Autowired和Resource的区别2.1 共同点:2.2 Autowired2.3 Resource2.3.1 Resource的装配顺序 3、Spring常用注解3.1、给容器中注入组件3.1.1 包扫描组件标注注解3.1.2…

Faster-RCNN跑自己的数据集(详细过程)FPN学习

1、下载b站 :霹雳吧啦Wz 的代码 github链接:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing 对应视频链接:2-自定义DataSet_哔哩哔哩_bilibili 2、配置环境,安装相应的包。 或者如果有报错可以直接更新重新…

数据结构之栈的详解

文章目录 一.什么是栈二. 栈的使用2.1栈的基本操作2.2 栈的基本使用 三.栈的实现3.1 数组实现栈的方式3.2 链式栈的实现 四.栈的应用4.1 括号匹配4.2 逆波兰表达式求值什么是逆波兰表达式 4.3 出栈入栈次序匹配4.4 最小栈五.总结 一.什么是栈 栈是一种先入后出(FILO)的线性表数…

【刷题笔记】结构体内存对齐举例+统计回文

一、结构体内存对齐举例 题目: 下面存在两个结构体: struct One {double d;char c;int i; } struct Two {char c;double d;int i; } 在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是? 分析: C/C中结构…

mysql8.0性能对比以及新特性

MySQL8.0 性能测试与新特性介绍 性能对比 测试内容 测试mysql5.7和mysql8.0 分别在读写、只读、只写模式((oltp_read_write,oltp_read_only,oltp_write_only))下不同并发时的性能(tps&#x…

《微服务实战》 第一章 Java线程池技术应用

前言 介绍Java的线程、线程池等操作 1、Java创建线程方式回顾 1.1、继承Thread类(只运行一次) public class ThreadTest extends Thread{Overridepublic void run() {System.out.println(Thread.currentThread().getName());}public static void main(String[] args) {new …

【python】keras包:深度学习( MLP多层感知器 Multi-Layer Perceptron)

MLP多层感知器 Multi-Layer Perceptron Part 1. 算法逻辑 实现经典问题——如何通过图像区分猫和狗 神经网络:建立模型,模仿人的思考机制 将“机器学习_逻辑回归”按照神经元的逻辑,组成逻辑网络。 解释: 假设自变量x[]和应变…

档案库房建设需要遵守的一些规定

各单位在建设档案室时需要对照《机关档案管理规定》《档案馆建筑设计规范》关于档案库房的相关标准,对库房的位置、面积、承重、安全等方面进行全面考虑,建设符合国家规定的档案库房。 档案库房建设需要遵守什么规定? 一、《机关档案管理规定…

Transformer的位置编码

1. 什么是位置编码,为什么要使用位置编码 简单来说位置编码就是给一个句子中的每个token一个位置信息,通过位置编码可以明确token的前后顺序关系。 对任何语言来说,句子中词汇的顺序和位置都是非常重要的。它们定义了语法,从而定…

DP(9)--插头DP

DP(9)--插头DP /* Mondriaan’s Dream题目大意:在 N*M 的棋盘内铺满 1*2 或 2*1 的多米诺骨牌,求方案数。 砖只有横放和竖放两种状态,把横放记为两个0,竖放记为上1下0,逐格DP,每次无论前一格…

Kali Linux 配置动态/静态 IP

[笔者系统版本] [Kali]: Kali Linux 2023.1 [Kernel]: kernel 6.1.0 [Desktop]: Xfce 4.18.1 1. Kali Linux 配置动态 IP (1). 首先查看网卡接口名称。 (2). 编辑网络接口配置文件。 (3). 网络接口配置文件的默认内容是这样的。 (4). 新增配置内容如下; 指定网卡…

ChatGPT :十几个国内免费可用 ChatGPT 网页版

前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言…

浅析智慧充电桩云平台的技术设计方案

自从我国提出“新基建”以来,充电基础设施产业也成为行业的话题与关注焦点。据数据统计,2021年,中国新能源汽车保有量达到784万辆,预计2025年,中国新能源汽车保有量达到2672万辆,2025年充电桩数量将达到654…

SwiftUI 新 Alert 弹出窗口帮你实现文本输入之梦

概览 小伙伴们都知道,弹出 Alert 不能包含文本输入框是 SwiftUI 的阿喀琉斯之踵(Achilles’ Heel) 。当然,这说的有些夸张了。😉 不过,Alert 不能包含 TextField 在某些情况下着实不方便。于是乎,从 SwiftUI 3.0&…

[pgrx开发postgresql数据库扩展]附1.存储过程的优缺点与数据库扩展函数

俗话说:天下大势,分久必合,合久必分。 最早的软件系统开发,讲究的就是一个全栈——在最早期的桌面软件时代,数据、用户界面和业务逻辑是完全混在一起的,讲究的就是一个一体化……那个年代也诞生了大量的码农…

MySQL基础(三)基本的SELECT语句

1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。但在这片浩…

同步辐射散射数据处理:从测量到分析的全流程解析

同步辐射散射数据处理:从测量到分析的全流程解析 同步辐射(Synchrotron radiation,SR)是指粒子在强磁场中受到加速或转向时所放出的辐射。这种辐射是一种非常强烈、具有非常高能量和亮度的电磁辐射。同步辐射散射(Sync…

怎么控制别人的电脑屏幕?

为什么需要控制别人的屏幕? 我们不可避免地会遇到一些情况,比如我们需要为我们的朋友、同事或家人提供有关 IT 相关问题的帮助,如果他们不知道它该怎么处理这些问题该怎么办呢? 这时,我们可能需要用我们的电脑…

聊点技术 | 全新功能,让Bonree ONE变得更强

4月21日,博睿数据ONE有引力2023春季产品发布会圆满落幕,Bonree ONE 2023春季正式版正式发布,带来更轻、更强、更智能的一体化智能可观测平台。 全新功能,让Bonree ONE变得更强 本文作者 产品经理高天明、产品经理吴学飞、产品经…