NIO特性
- 事件驱动模型
- 避免多线程
- 单线程处理多任务
- 非阻塞I/O,I/O读写不再阻塞,而是返回0
- 基于block的传输,通常比基于流的传输更高效
- 更高级的IO函数,zero-copy
- IO多路复用大大提高了Java网络应用的可伸缩性和实用性
Netty对NIO的API进行了封装,通过以下手段让性能又得到了一定程度的提升
1. 使用多路复用技术,提高处理连接的并发性
2. 零拷贝:
1). Netty的接收和发送数据采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝
2). Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象进行一次操作
3). Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题
3. 内存池:为了减少堆外直接内存的分配和回收产生的资源损耗问题,Netty提供了基于内存池的缓冲区重用机制
4. 使用主从Reactor多线程模型,提高并发性
5. 采用了串行无锁化设计,在IO线程内部进行串行操作,避免多线程竞争导致的性能下降
6. 默认使用Protobuf的序列化框架
7. 灵活的TCP参数配置
RocketMQ为什么能支持高并发
1:支持集群模型,强调集群无单点,负载均衡以及水平扩展能力
2:亿级别的消息堆积能力
3:采用零拷贝原理Consumer 消费消息过程,使用了零拷贝 顺序写盘随机读
4:丰富的api 同步消息,异步消息 顺序消息,延迟消息,事务消息
5:底层通信框架采用netty nio
6: nameserver 代替zookpeer
7: 消息消费失败重试机制,消息可查询