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