其他分享
首页 > 其他分享> > Netty 系列之经典面试题汇集

Netty 系列之经典面试题汇集

作者:互联网

面试官:

       1. 请您说一下netty的线程组模型?

我:

       线程组就是EventLoopGroup, 一般客户端和服务端用2个线程组就够,一个Boss线程组,一个worker线程组,boss线程组的数量为1, workd线程组的数量为默认的数量。

面试官:

       2. 设置boss线程组的数量为什么为1,有什么讲究嘛?

我:

       设置boss线程组数量为1,就是为了监听socketChannel里的连接,然后将socketChannel包装成NioSocketChannel, 另外Boss线程组会将NioSocketChannel注册到worker线程组的selector里,同时监听OP_WRITE和OP_READ事件,使用一个线程组即为了节省资源开销,如果请求数量比较多,可以稍微主线程组数。

面试官:

       3. 当worker线程监听到某个SocketChannel 有I/O事件时,会进行哪些操作?

我:

(1) worker线程组首先会向内存池中分配内存,读取I/O数据流。

(2) 然后将读取到的数据转交给解码器Handler进行解码,如果能够解析出完整的数据包,那么会将数据包转交给业务逻辑处理的Handler处理。

(3) 将业务逻辑处理器Handler 处理完后,在返回响应结果前,交给编码器进行数据加密。

(4) 最终写到缓存区,并由I/O worker 线程将缓存区的数据输出到网络中,最终到达客户端。

 

面试官:

       4. 那怎么解决数据传输过程的粘包问题呢?

我:

常用的解决方案有三种:

       (1) 将换号符号或特殊标识符号加入到数据包中(如 \n , \r\n等), 比如HTTP和FTP。

       (2) 将消息分为head和Body, head里包含body 里消息的长度。

       (3) 固定长度的数据包,如固定100个字节,不足用空格补全。

三种方案的具体实现:

       (1) Netty的解码器 lineBasedFrameDecoder, 可以判断字节中是否出现了‘\n’ 或 '\r\n'。

       (2) Netty有编码器LengthFieldPrepender和解码器 lengthFieldBasedFrameDecoder, 可以在消息中加入消息体的长度值。

       (3) 使用固定数据包长度的解码器, FixedLengthFrameDecoder。

 

 

 

标签:Netty,面试题,worker,面试官,boss,汇集,解码器,线程,数据包
来源: https://blog.csdn.net/qq_33036061/article/details/117397027