热点

netty在甚么阶段进修(不看谜底你会几道)

时间:2010-12-5 17:23:32  作者:热点   来源:时尚  查看:  评论:0
内容摘要:1.BIO、NIO 和 AIO 的区分? BIO:一个衔接一个线程,客户端有衔接乞求时办事器端就需要启动一个线程停止处置。线程开支大年夜。 伪异步 IO:将乞求衔接放入线程池,一对多,但线程照样很珍贵 台湾顶级茶叶店品牌会暨红 茶叶

netty在甚么阶段进修(不看谜底你会几道)(1)

1.BIO、阶段进修NIO 和 AIO 的谜底区分?

BIO:一个衔接一个线程,客户端有衔接乞求时办事器端就需要启动一个线程停止处置。阶段进修线程开支大年夜。谜底

伪异步 IO:将乞求衔接放入线程池,阶段进修一对多,谜底台湾顶级茶叶店品牌但线程照样很珍贵的阶段进修资本。

NIO:一个乞求一个线程,谜底但客户端发送的阶段进修衔接乞求都邑注册到多路复用器上,多路复用器轮询到衔接有 I/O 乞求时才启动一个线程停止处置。谜底

AIO:一个有效乞求一个线程,阶段进修客户端的谜底 I/O 乞求都是由 OS 先完成了再通知办事器运用往启动线程停止处置,

BIO 是阶段进修面向流的,NIO 是谜底面向缓冲区的;BIO 的各类流是壅塞的。而 NIO 诟谇壅塞的阶段进修;BIO的 Stream 是单向的,而 NIO 的 Channel 是双向的。

NIO 的特点:事宜驱动模型、单线程处置多义务、非壅塞 I/O,I/O 读写不再壅塞,而是前往 0、基于 block 的传输比基于流的传输更高效、更初等的 IO 函数 zero-copy、IO 多路复用大年夜大年夜提高了 java 搜集运用的可伸缩性和有效性。基于 Reactor 线程模型。

在 Reactor 形式中,事宜分发器等候某个事宜或可运用或个操作的状况发生,事宜分发器就把这个事宜传给事前注册的事宜处置函数或回调函数,由后者来做实践的读写操作。如在 Reactor 中完成读:注册读就绪事宜和照应的事宜处置器、事宜分发器等候事宜、事宜到来,激活分发器,分发器调用事宜对应的处置器、事宜处置器完成实践的读操作,处置读到的数据,注册新的事宜,然后返还把持权。

2.NIO 的构成?

Buffer:与 Channel 停止交互,数据是从 Channel 读入缓冲区,从缓冲区写入 Channel 中的

flip 方法 : 反转此缓冲区,将 position 给 limit,然后将 position 置为 0,真实就是切换读写形式

clear 方法 :断根此缓冲区,将 position 置为 0,把 capacity 的值给 limit。

rewind 方法 : 重绕此缓冲区,将 position 置为 0

DirectByteBuffer 可增添一次体系空间到用户空间的浙江茶叶产量拷贝。但 Buffer 创立和烧毁的本钱更高,弗成控,深刻会用内存池来提高机能。直接缓冲区重要分派给那些易受基本体系的本机 I/O 操作影响的大年夜型、耐久的缓冲区。假设数据量比拟小的中小运用状况下,可以琢磨运用 heapBuffer,由 JVM 停止管理。

Channel:走漏表示 IO 源与方针翻开的衔接,是双向的,但不克不及直接访问数据,只能与 Buffer停止交互。经由进程源码可知,FileChannel 的 read 方法和 write 方法都招致数据复制了两次!

Selector 可使一个零丁的线程管理多个 Channel,open 方法可创立 Selector,register 方法向多路复用器器注册通道,可以监听的事宜类型:读、写、衔接、accept。

注册事宜后会发生一个 SelectionKey:它走漏表示 SelectableChannel 和 Selector 之间的注册关系,wakeup 方法:使还没有前往的第一个选择操作立时前往,唤醒的缘由原由是:注册了新的 channel 或事宜;channel 封锁,取消注册;优先级更高的事宜触发(如准时器事宜),盼看及时处置。

Selector 在 Linux 的完成类是 epollSelectorImpl,拜托给 EPollArrayWrapper 完成,个中三个native 方法是对 epoll 的封装,而 EPollSelectorImpl. implRegister 方法,经由进程调用 epoll_ctl

向 epoll 实例中注册事宜,还将注册的文件描画符(fd)与 SelectionKey 的对应关系添加到fdToKey 中,这个 map 维护了文件描画符与 SelectionKey 的映照。

fdToKey 有时会变得特别很是大年夜,由于注册到 Selector 上的 Channel 特别很是多(百万衔接);过时或掉落效的 Channel 没有及时封锁。fdToKey 老是串行读取的,而读取是在 select 方法中停止的,该方法诟谇线程安然的。

Pipe:两个线程之间的单向数据衔接,数据会被写到 sink 通道,从 source 通道读取

NIO 的办事端建树进程:Selector.open():翻开一个 Selector;ServerSocketChannel.open():

创立办事端的 Channel;bind():绑定到某个端口上。并设置非壅塞形式;register():注册

Channel 和存眷的事宜到 Selector 上;select()轮询拿到已就绪的事宜

3.Netty 的特点?

一个高机能、异步事宜驱动的 NIO 框架,它供应了对 TCP、UDP 和文件传输的支撑运用更高效的 socket 底层,对 epoll 空轮询激起的 cpu 占用飙升在外部停止了处置,幸免了直策运用 NIO 的浙江茶叶老板联系方式圈套,简化了 NIO 的处置方法。

采取多种 decoder/encoder 支撑,对 TCP 粘包/分包停止自动化处置可运用接纳/处置线程池,提高衔接屈服,对重连、心跳检测的复杂支撑可设置 IO 线程数、TCP 参数, TCP 接纳和发送缓冲区运用直接内存替代堆内存,经由进程内存池的方法轮回运用 ByteBuf经由进程援用计数器及时央求释放不再援用的对象,降低了 GC 频率运用单线程串行化的方法,高效的 Reactor 线程模型大年夜量运用了 volitale、运用了 CAS 和原子类、线程安然类的运用、读写锁的运用

4.Netty 的线程模型?

Netty 经由进程 Reactor 模型基于多路复用器接纳并处置用户乞求,外部完成了两个线程池,boss 线程池和 work 线程池,个中 boss 线程池的线程担负处置乞求的 accept 事宜,当接纳到 accept 事宜的乞求时,把对应的 socket 封装到一个 NioSocketChannel 中,并交给work 线程池,个中 work 线程池担负乞求的 read 和 write 事宜,由对应的 Handler 处置。

单线程模型:全部 I/O 操作都由一个线程完成,即多路复用、事宜分发和处置都是在一个Reactor 线程上完成的。既要接纳客户端的衔接乞求,向办事端提议衔接,又要发送/读取乞求或应对/照应音讯。一个 NIO 线程同时处置成百上千的链路,机能上没法支撑,速度慢,若线程进入逝世轮回,全部法度典范弗成用,关于高负载、大年夜并发的运用途景不适宜。

多线程模型:有一个 NIO 线程(Acceptor) 只担负监听办事端,接纳客户端的 TCP 衔接乞求;NIO 线程池担负搜集 IO 的操作,即音讯的读取、解码、编码和发送;1 个 NIO 线程可以同时处置 N 条链路,然则 1 个链路只对应 1 个 NIO 线程,这是为了防止发生并发操作标题。但在并发百万客户端衔接或需要安然认证时,一个 Acceptor 线程能够会存在机能缺乏标题。

主从多线程模型:Acceptor 线程用于绑定监听端口,接纳客户端衔接,将 SocketChannel从主线程池的 Reactor 线程的多路复用器上移除,重新注册到 Sub 线程池的浙江泉苑茶叶有限公司线程上,用于处置 I/O 的读写等操作,从而包管 mainReactor 只担负接入认证、握手等操作;

5.TCP 粘包/拆包的缘由原由及处置方法?

TCP 是以流的方法来处置数据,一个完全的包能够会被 TCP 拆分红多个包停止发送,也能够把小的封装成一个大年夜的数据包发送。

TCP 粘包/分包的缘由原由:

运用法度典范写入的字节大年夜小大年夜于套接字发送缓冲区的大年夜小,会发生拆包现象,而运用法度典范写入数据小于套接字缓冲区大年夜小,网卡将运用屡次写入的数据发送到搜集上,这将会发生粘包现象;

停止 MSS 大年夜小的 TCP 分段,当 TCP 报文长度-TCP 头部长度>MSS 的时辰将发生拆包以太网帧的 payload(净荷)大年夜于 MTU(1500 字节)停止 ip 分片。

处置方法

音讯定长:FixedLengthFrameDecoder 类

包尾促进非凡字符瓜分:行分隔符类:LineBasedFrameDecoder 或自定义分隔符类 : DelimiterBasedFrameDecoder

将音讯分为音讯头和音讯体:LengthFieldBasedFrameDecoder 类。分为有头部的拆包与粘包、长度字段在前且有头部的拆包与粘包、多扩展头部的拆包与粘包。

6.懂得哪几种序列化协议?

序列化(编码)是将对象序列化为二进制情势(字节数组),重要用于搜集传输、数据耐久 化等;而反序列化(解码)则是将从搜集、磁盘等读取的字节数组恢复成原始对象,重要用于搜集传输对象的解码,以便完生长途调用。

影响序列化机能的关键成分:序列化后的码流大年夜小(搜集带宽的占用)、序列化的机能(CPU 资本占用);是不是支撑跨说话(异构体系的对接和开拓说话切换)。

Java 默许供应的序列化:没法跨说话、序列化后的码流太大年夜、序列化的机能差

XML,

优点:人机可读性好,可指定元素或特点的称号。

缺陷错误:序列化数据只包括数据自身和类的结构,不包括类型标识和法度典范集信息;只能序列化公共属性和字段;不克不及序列化方法;文件复杂,文件格式复杂,传输占带宽。

有效处景:当做设置文件存储数据,及时数据转换。

JSON,是一种轻量级的数据交流格式,

优点:兼容性高、数据格式比拟复杂,易于读写、序列化后数据较小,可扩展性好,兼容性好、与 XML 比拟,其协议比拟复杂,解析速度比拟快。

缺陷错误:数据的描画性比 XML 差、不适宜机能央求为 ms 级其他状况、浙江省茶叶面积和产量额外空间开支比拟大年夜。

有效处景(可替代XML):跨防火墙访问、可调式性央求高、基于 Web browser 的 Ajax 乞求、传输数据量相对小,及时性央求相对低(例如秒级别)的办事。

Fastjson,采取一种“假定有序快速婚配”的算法。

优点:接口复杂易用、而今 java 说话中最快的 json 库。

缺陷错误:过于注重快,而偏离了“规范”及功用性、代码质量不高,文档不全。

有效处景:协议交互、Web 输入、Android 客户端

Thrift,不只是序列化协议,照样一个 RPC 框架。

优点:序列化后的体积小, 速度快、支撑多种说话和丰厚的数据类型、关于数据字段的增删具有较强的兼容性、支撑二进制紧缩编码。

缺陷错误:运用者较少、跨防火墙访问时,不安然、不具有可读性,调试代码时相对艰辛、不克不及与其他传输层协议合营运用(例如 HTTP)、没法支撑向耐久层直接读写数据,即不适宜做数据耐久化序列化协议。

有效处景:散布式体系的 RPC 处置谋划

Avro,Hadoop 的一个子项目,处置了 JSON 的烦复和没有 IDL 的标题。

优点:支撑丰厚的数据类型、复杂的静态说话结合功用、具有自我描画属性、提高了数据解析速度、快速可紧缩的二进制数据情势、可以完生长途进程调用 RPC、支撑跨编程说话完成。

缺陷错误:关于习尚于静态类型说话的用户不直不雅。

有效处景:在 Hadoop 中做 Hive、Pig 和 MapReduce 的耐久化数据格式。

Protobuf,将数据结构以.proto 文件停止描画,经由进程代码生成对象可以生成对应数据结构的POJO 对象和 Protobuf 相关的方法和属性。

优点:序列化后码流小,机能高、结构化数据存储格式(XML JSON 等)、经由进程标识字段的次第,可以完成协议的前向兼容、结构化的文档更随便管理和维护。

缺陷错误:需要依靠于对象生成代码、支撑的说话相对较少,官方只支撑Java 、C 、python。

有效处景:对机能央求高的 RPC 调用、具有优胜的跨防火墙的访问属性、合顺运用层对象的耐久化

其他

protostuff 基于 protobuf 协议,但不需要设置 proto 文件,直接导包即可Jboss marshaling 可以直接序列化 java 类, 不用实 java.io.Serializable 接口

Message pack 一个高效的二进制序列化格式

Hessian 采取二进制协议的轻量级 remoting onhttp 对象

kryo 基于 protobuf 协议,只支撑 java 说话,需要注册(Registration),然后序列化 (Output),反序列化(Input)

7.若何选择序列化协议?

详细场景

关于公司间的体系调用,假设机能央求在 100ms 以上的办事,基于 XML 的 SOAP 协议是一个值得琢磨的谋划。

基于 Web browser 的 Ajax,和 Mobile app 与办事端之间的通讯,JSON 协议是首选。关于机能央求不太高,或以静态类型说话为主,或传输数据载荷很小的的运用途景,JSON也诟谇常不错的选择。

关于调试状况比拟恶劣的场景,采取 JSON 或 XML 可以也许极大年夜的提高调试屈服,降低体系开拓本钱。

当对机能和繁复性有极高央求的场景,Protobuf,Thrift,Avro 之间具有一定的竞争关系。

关于 T 级其他数据的耐久化运用途景,Protobuf 和 Avro 是重要选择。假设耐久化后的数据存储在 hadoop 子项目里,Avro 会是更好的选择。

关于耐久层非 Hadoop 项目,以静态类型说话为主的运用途景,Protobuf 会更相符静态类型说话工程师的开拓习尚。由于 Avro 的谋划理念倾向于静态类型说话,关于静态说话为主的运用途景,Avro 是更好的选择。假设需要供应一个完全的 RPC 处置谋划,Thrift 是一个好的选择。

假设序列化今后需要支撑不合的传输层协议,或需要跨防火墙访问的高机能场景,Protobuf 可以优先琢磨。

protobuf 的数据类型有多种:bool、double、float、int32、int64、string、bytes、enum、message。protobuf 的限制符:required: 必需赋值,不克不及为空、optional:字段可以赋值,也可以或许不赋值、repeated: 该字段可以重复恣意次数(包括 0 次)、罗列;只能用指定的常量集中的一个值作为其值;

protobuf 的基本规矩:每个音讯中必需最少留有一个 required 类型的字段、包括 0 个或多个 optional 类型的字段;repeated 走漏表示的字段可以包括 0 个或多个数据;[1,15]以内的标识号在编码的时辰会占用一个字节(经常运用),[16,2047]以内的标识号则占用 2 个字节,标识号一定不克不及重复、运用音讯类型,也可以或许将音讯嵌套恣意多层,可用嵌套音讯类型来替代组。

protobuf 的音讯进级绳尺:不要更改任何已有的字段的数值标识;不克不及移除已存在的required 字段,optional 和 repeated 类型的字段可以被移除,但要保管标号不克不及被重用。

新添加的字段必需是 optional 或 repeated。由于旧版本法度典范没法读取或写入新增的required 限制符的字段。

编译器为每一个音讯类型生成了一个.java 文件,和一个非凡的 Builder 类(该类是用来创立音讯类接口的)。

如:UserProto.User.Builder builder =UserProto.User.newBuilder();builder.build();

Netty 中的运用:ProtobufVarint32FrameDecoder 是用于处置半包音讯的解码类;

ProtobufDecoder(UserProto.User.getDefaultInstance())这是创立的 UserProto.java 文件中的解码类;

ProtobufVarint32LengthFieldPrepender 对 protobuf 协议的音讯头上加上一个长度为32 的整形字段,用于标志这个音讯的长度的类;

ProtobufEncoder 是编码类将 StringBuilder 转换为 ByteBuf 类型:copiedBuffer()方法

8.Netty 的零拷贝完成?

Netty 的接纳和发送 ByteBuffer 采取 DIRECT BUFFERS,运用堆外直接内存停止 Socket 读写,不需要停止字节缓冲区的二次拷贝。堆内存多了一次内存拷贝,JVM 会将堆内存Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。

ByteBuffer 由 ChannelConfig 分派,而 ChannelConfig 创立 ByteBufAllocator 默许运用 Direct Buffer

CompositeByteBuf 类可以将多个 ByteBuf 归并为一个逻辑上的 ByteBuf, 幸免了传统经由进程 内存拷贝的方法将几个小 Buffer 归并成一个大年夜的 Buffer。addComponents 方法将 header 与 body 归并为一个逻辑上的 ByteBuf, 这两个 ByteBuf 在 CompositeByteBuf 外部都是单 独存在的, CompositeByteBuf 只是逻辑上是一个集团

经由进程 FileRegion 包装的 FileChannel.tranferTo 方法 完成文件传输, 可以直接将文件缓冲区 的数据发送到方针 Channel,幸免了传统经由进程轮回 write 方法招致的内存拷贝标题。经由进程 wrap 方法, 我们可以将 byte[] 数组、ByteBuf、ByteBuffer 等包装成一个 Netty ByteBuf 对象, 进而幸免了拷贝操作。

Selector BUG:若 Selector 的轮询效果为空,也没有 wakeup 或新音讯处置,则发生空轮询,CPU 运用率 100%,

Netty 的处置举动:对 Selector 的 select 操作周期停止统计,每完成一次空的 select 操作停止一次计数,若在某个周期内继续发生 N 次空轮询,则触发了 epoll 逝世轮回 bug。重建Selector,剖断是不是是其他线程提议的重建乞求,若不是则将原 SocketChannel 从旧的Selector 上往除注册,重新注册到新的 Selector 上,并将原本的 Selector 封锁。

9.Netty 的高机能表而今哪些方面?

心跳,对办事端:会准时断根闲置会话 inactive(netty5),对客户端:用来检测会话是不是断开,是不是重来,检测搜集耽误,个中 idleStateHandler 类 用来检测会话状况

串行无锁化谋划,即音讯的处置尽能够在同一个线程内完成,时代不停止线程切换,多么就幸免了多线程竞争和同步锁。外不雅上看,串行化谋划似乎 CPU 运用率不高,并发水平不敷。然则,经由进程调剂 NIO 线程池的线程参数,可以同时启动多个串行化的线程并交运转,

这类局部无锁化的串行线程谋划比拟一个队列-多个任务线程模型机能更优。

靠得住性,链路有效性检测:链路余暇检测机制,读/写余暇超时机制;内存维护机制:经由进程内存池重用 ByteBuf;ByteBuf 的解码维护;优雅停机:不再接纳新音讯、参与前的预处置操作、资本的释放操作。

Netty 安然性:支撑的安然协议:SSL V2 和 V3,TLS,SSL 单向认证、双向认证和第三方 CA认证。

高效并发编程的表现:volatile 的大年夜量、切确运用;CAS 和原子类的普遍运用;线程安然容器的运用;经由进程读写锁选拔并发机能。IO 通讯机能三绳尺:传输(AIO)、协议(Http)、线程(主从多线程)

流量整型的感染(变压器):防止由于上优良网元机能不平衡招致优良网元被压垮,营业流截止;防止由于通讯模块接纳音讯过快,后端营业线程处置不及时招致撑逝世标题。

TCP 参数设置:SO_RCVBUF 和 SO_SNDBUF:深刻建议值为 128K 或 256K;

SO_TCPNODELAY:NAGLE 算法经由进程将缓冲区内的小封包自动相连,构成较大年夜的封包,截止大年夜量小封包的发送壅塞搜集,从而提高搜集运用屈服。然则关于时延敏感的运用途景需要封锁该优化算法;

10.NIOEventLoopGroup 源码?

NioEventLoopGroup(真实是 MultithreadEventExecutorGroup) 外部维护一个类型为 EventExecutor children [], 默许大年夜小是处置器核数 * 2, 多么就构成了一个线程池,初始化EventExecutor 时 NioEventLoopGroup 重载 newChild 方法,所以 children 元素的实践类型为NioEventLoop。

线程启动时调用 SingleThreadEventExecutor 的结构方法,实施 NioEventLoop 类的 run 方法,起首会调用 hasTasks()方法剖断以后 taskQueue 是不是有元素。假设 taskQueue 中有元素,实施 selectNow() 方法,最终实施 selector.selectNow(),该方法会立时前往。假设 taskQueue 没有元素,实施 select(oldWakenUp) 方法

select ( oldWakenUp) 方法处置了 Nio 中的 bug,selectCnt 用来记载 selector.select 方法的实施次数和标识是不是实施过 selector.selectNow(),若触发了 epoll 的空轮询 bug,则会几回再三实施 selector.select(timeoutMillis),变量 selectCnt 会逐突变大年夜,当 selectCnt 到达阈值(默许 512),则实施 rebuildSelector 方法,停止 selector 重建,处置 cpu 占用 100%的 bug。

rebuildSelector 方法先经由进程 openSelector 方法创立一个新的 selector。然后将 old selector 的selectionKey 实施 cancel。末尾将 old selector 的 channel 重新注册到新的 selector 中。

rebuild 后,需要重新实施方法 selectNow,反省是不是有已 ready 的 selectionKey。

接上去调用 processSelectedKeys 方法(处置 I/O 义务),当 selectedKeys != null 时,调用processSelectedKeysOptimized 方法,迭代 selectedKeys 猎取就绪的 IO 事宜的 selectkey 寄存在数组 selectedKeys 中, 然后为每个事宜都调用 processSelectedKey 来处置它,processSelectedKey 等区分处置 OP_READ;OP_WRITE;OP_CONNECT 事宜。

末尾调用 runAllTasks 方法(非 IO 义务),该方法起首会调用fetchFromScheduledTaskQueue方法,把 scheduledTaskQueue 中已跨越耽误实施时辰的义务移到 taskQueue 中等候被实施,然后依次从 taskQueue 中取义务虚施,每实施 64 个义务,停止耗时反省,假设已实施时辰跨越预先设定的实施时辰,则遏制实施非 IO 义务,幸免非 IO 义务太多,影响 IO 义务的实施。

每个 NioEventLoop 对应一个线程和一个 Selector,NioServerSocketChannel 会自动注册到某一个 NioEventLoop 的 Selector 上,NioEventLoop 担负事宜轮询。

Outbound 事宜都是乞求事宜, 提议者是 Channel,处置者是 unsafe,经由进程 Outbound 事宜停止通知,传达倾向是 tail 到 head。Inbound 事宜提议者是 unsafe,事宜的处置者是Channel, 是通知事宜,传达倾向是从头到尾。

内存管理机制,起首会预央求一大年夜块内存 Arena,Arena 由很多 Chunk 构成,而每个 Chunk默许由 2048 个 page 构成。Chunk 经由进程 AVL 树的情势结构 Page,每个叶子节点走漏表示一个Page,而中心节点走漏表示内存地域,节点自身记载它在全部 Arena 中的偏移地址。本地域被分派出往后,中心节点上的标志位会被标志,多么就走漏表示这个中心节点以下的全部节点都已被分派了。大年夜于 8k 的内存分派在 poolChunkList 中,而 PoolSubpage 用于分派小于 8k 的内存,它会把一个 page 瓜分红多段,停止内存分派。

ByteBuf 的特点:支撑自动扩容(4M),包管 put 方法不会抛出异常、经由进程内置的复合缓冲类型,完成零拷贝(zero-copy);不需要调用 flip()来切换读/写形式,读取和写入索引分开;方法链;援用计数基于 AtomicIntegerFieldUpdater 用于内存收受接纳;PooledByteBuf 采取 二叉树来完成一个内存池,集中管理内存的分派和释放,不消每次运用都新建一个缓冲区对象。UnpooledHeapByteBuf 每次都邑新建一个缓冲区对象。

以上就是Netty面试专题及谜底,以下是最新总结的最全2019初等Java必考题范围和谜底,范围包括最全MySQL、Spring、Redis、JVM等最周全试题和谜底

猎取方法:后台私信“面试”即可收费猎取!

记得转发哦!!

最全阿里初等Java必考题范围与谜底

netty在甚么阶段进修(不看谜底你会几道)(2)

,展开全文

免责声明:本文仅代表文章作者的小我不雅点,与本站有关。其原创性、真实性和文中陈说文字和内容未经本站证明,对本文和个中扫数或局部外容文字的真实性、完全性和原创性本站不作任何包管或承诺,请读者仅作参考,并自行核实相关内容。

copyright © 2023 powered by EMMIE信息站   sitemap