博客
关于我
Netty相关
阅读量:789 次
发布时间:2023-02-15

本文共 2059 字,大约阅读时间需要 6 分钟。

1.BIO、NIO和AIO的区别
BIO是基于单线程模型,客户端连接请求会启动一个线程进行处理,线程开销较大。 伪异步IO仍然依赖线程池,资源利用率有限。 NIO通过多路复用器实现非阻塞I/O,客户端连接注册到多路复用器,轮询时主动处理就绪的事件。 AIO则是基于事件驱动模型,客户端的I/O操作由操作系统完成后通知应用启动线程处理,AIO是非阻塞的,适合高并发场景。 BIO和NIO在I/O方式上有显著差异,BIO是基于流的,而NIO是基于缓冲区的。BIO的I/O操作是阻塞的,而NIO是非阻塞的。
2.NIO的组成
NIO的主要组成包括: - **Buffer**:用于与Channel交互,负责数据的读写。 - **flip()**:切换读写模式。 - **clear()**:清除缓冲区,重置position为0。 - **rewind()**:重置position为0。 - **DirectByteBuffer**:直接使用用户内存,减少系统拷贝,但创建销毁成本较高。 - **Channel**:表示I/O源或目标的连接,是双向的。 - **Selector**:管理多个Channel,处理读写事件。 - **Pipe**:线程间的单向数据通道。 - **ServerSocketChannel**:用于建立NIO服务端,支持非阻塞模式。
3.Netty的特点
Netty是一个高性能的NIO框架,支持TCP、UDP和文件传输,提供异步事件驱动模型。 Netty避免了NIO空轮询引起的CPU占用问题,提供了高效的IO线程池和多种协议处理能力。 Netty支持多种序列化协议和编码解码机制,提供灵活的配置选项,适合高并发和大规模应用。
4.Netty的线程模型
Netty基于Reactor模型,内部维护两个线程池:boss线程池和work线程池。 - **单线程模型**:所有I/O操作由一个线程完成,适合小规模的应用。 - **多线程模型**:Acceptor线程负责接收连接,work线程池处理读写操作,适合大规模并发场景。 - **主从多线程模型**:Acceptor线程负责接入和握手,work线程池处理I/O操作,提升处理能力。
5.TCP粘包/拆包的原因及解决方法
TCP是流式协议,可能将一个数据包拆分为多个或多个数据包发送。 - **粘包原因**:应用程序写入数据大小超过套接字缓冲区,或MSS大小不足。 - **解决方法**: - **消息定长**:固定长度分隔符。 - **行分隔符**:基于行或自定义分隔符。 - **长度字段**:基于长度字段分隔。
6.了解哪几种序列化协议
- **序列化**:将对象转为二进制字节数组。 - **XML**:人机可读性强,但文件复杂,传输占带宽。 - **JSON**:轻量级,兼容性高,适合Web应用。 - **Protobuf**:高效,适合高性能RPC。 - **Thrift**:支持多语言,适合分布式系统。 - **Avro**:支持动态类型,适合大数据存储。 - **Fastjson**:Java中最快的JSON库。 - **Kryo**:基于Protobuf,适合Java。
7.如何选择序列化协议
选择协议需根据具体场景:性能、跨语言、数据格式等。 - **XML**适合配置文件,实时数据转换。 - **JSON**适合Web、移动端。 - **Protobuf/Avro**适合大数据存储、持久化。 - **Thrift**适合RPC解决方案。
8.Netty的零拷贝实现
Netty通过Direct Buffers减少内存拷贝,使用CompositeByteBuf合并缓冲区,提高效率。 - **Direct Buffers**:直接使用用户内存。 - **CompositeByteBuf**:逻辑合并多个缓冲区。 - **FileRegion**:用于文件传输,减少拷贝。 - **ByteBuf管理**:通过内存池重用缓冲区,避免频繁分配。
9.Netty的高性能体现在哪些方面
- **心跳机制**:检测会话状态,避免闲置链路占用。 - **串行化设计**:避免多线程竞争,提升性能。 - **可靠性**:链路空闲检测、内存保护。 - **高效并发**:使用CAS和读写锁。 - **TCP参数**:优化SO_RCVBUF和SO_SNDBUF。
10.NIOEventLoopGroup源码
NIOEventLoopGroup维护线程池和Selector,处理I/O任务。 - **线程管理**:根据配置创建NioEventLoop。 - **空轮询问题**:通过selectCnt检测空轮询,重建Selector。 - **事件处理**:分为Inbound和Outbound事件,传播方向不同。 - **内存管理**:使用Arena和Chunk管理内存。 - **ByteBuf优化**:支持零拷贝和扩容。

转载地址:http://hvcfk.baihongyu.com/

你可能感兴趣的文章
Nami 项目使用教程
查看>>
Nancy之基于Nancy.Hosting.Aspnet的小Demo
查看>>
NAND NOR FLASH闪存产品概述
查看>>
nano 编辑
查看>>
NASA网站曝严重漏洞,或将沦为黑客钓鱼网站?
查看>>
Nash:轻量级、安全且可靠的脚本语言
查看>>
NAS、SAN和DAS的区别
查看>>
NAS个人云存储服务器搭建
查看>>
nat 网卡间数据包转发_你是不是从来没有了解过光纤网卡,它跟普通网卡有什么区别?...
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>
NAT-DDNS内网穿透技术,解决动态域名解析难题
查看>>
natapp搭建外网服务器
查看>>
NativePHP:使用PHP构建跨平台桌面应用的新框架
查看>>
Nat、端口映射、内网穿透有什么区别?
查看>>
Nat、端口映射、内网穿透有什么区别?
查看>>
nat打洞原理和实现
查看>>
NAT技术
查看>>
NAT模式/路由模式/全路由模式 (转)
查看>>
NAT模式下虚拟机centOs和主机ping不通解决方法
查看>>
NAT的两种模式SNAT和DNAT,到底有啥区别?
查看>>