标签:Netty 面试题 worker 面试官 boss 汇集 解码器 线程 数据包
面试官:
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。