什么是Netty 为什么使用使用 有什么优点
Netty是基于java nio封装而来的同步非阻塞 通信框架;
优点是使用了nio,通信效率高,而且支持大量的并发通信;
nio是单线程 监控多个 channel注册到 selector;selector轮询检查selector是否准备好读写,准备后了进行读写;
nio 在linux内核做了磁盘到内存的映射,速度非常快
nio使用的是epoll多路复用机制,使用的数据结构是hash表,时间复杂度为
O(1),效率比poll和select的效率高;
Netty的核心组件有那些
Channel、回调、Future、事件和ChannelHandler
Channel是Java NIO的一个基本构造 一个 Channel 就是一个 socket回调
一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。
请谈一谈你对ByteBuf的认识
ByteBuf是一个封装传输字节的容器;
在Netty的世界里,有三种使用方式;
一种是申请ByteBuf池里的内存;
一种是申请堆空间的内存;
一种是申请堆外内存;
第一种申请ByteBuf池的思想和线程池类似,都是为了节约创建和销毁内存的开销;
第二种使用heap堆的内存会有一点性能上的损耗,因为执行的时候会将堆内存的内容复制到channel中,
第三种:使用堆外内存,它的分配和回收慢一点,不过读取的效率高;
你选择什么
在和设备进行通信的时候,会有大量的IO写入和写出,我使用DirectByteBuf;
eg:
后端一些业务代码,使用HeapByteBuf;
1. netty使用了什么设计模式
责任链模式
2. 如何处理沾包半包的问题
1 可以 用 header都中表明包的长度,根据长度进行接收;
2 使用使用分隔符;但是字符串中的分隔符需要转译;
3 固定长度,不够的空格进行补齐(可能浪费空间)
TCP 为什么有沾包半包的问题?
tcp 是字节流,默认发送包大小为1024k;如果报文分包很小,多个才能 填满1024的buffer;那么就会几个包一起发送就是沾包了;
如果报文分包很大,一个就有10兆,那么,就需要分包发送,也就是半包;