5.5.1 如何使用netty支撑百万级并发连接
BIO对应的直接是网络internet
NIO对应的是系统事件event
1.TCP连接区分—四元组
2.数据传输格式【网络协议】
协议–约定–网络 发送方–接收方 共同认可
HTTP协议传输内容比较多【解析、传输消耗资源】
【特定的客户端】Dubbo、Redis、MQ、数据库
针对特定的场景,需要自定义网络协议【性能需要、安全需要】
自定义协议【语法、语义、时序】
1-foxgl-20
语法:即数据与控制信息的结构或格式。格式就是字符组成,每个部分用"-"分隔
语义:即需要发送何种控制信息,完成何种动作以及做出何种响应。如果要新增数据,首字符写1,如果要删除,写0
时序:顺序的详细说明。如果客户端发送1,0…服务端处理完毕之后,需要返回一个R-开头的响应
websorcket协议:建立连接之后,双方都主动发送数据(聊天窗场景)
http协议:请求/响应–>先有请求,再有响应
网络 粘包、拆包
粘包:数据包超过协议单次大小
1.发送数据过多
2.接收方处理过慢
拆包:数据包不完整
1.发送数据比较多,超过缓冲区,拆分发送
2.接收方处理太慢,读取数据的时候,剩下一部分不完整的数据
解决方案:
1.固定长度
2.特定开头和结尾 head+body
netty实例代码【http协议】
百万连接
并发处理***【同时处理多少请求】***
并发连接***【同事建立多少连接】***
- 打开的文件过多【java.net.SocketException:Too many open files】【高并发必然碰到】
* 文件描述符—都是操作系统里面宝贵的资源【网络】
* 调大操作系统参数【足够的内存、】
查看网络连接数目:
DDOS攻击 -->靠服务器带宽抗住,一般服务器挂掉
分布式拒绝服务攻击
5.5.2 netty实战中的注意事项
使用netty做RPC框架
tomcat -->
1.收到网络数据
2.根据HTTP协议,编解码 -->request、response对象【Http协议+servlet规范】
3.调用项目中的servletb
netty–>
1.收到网络数据
2.编解码–系统对应JAVA对象
3.处理后续逻辑
网易邮箱内部架构:
netty – 难度 你的业务逻辑性能
1.数据库
2.业务逻辑–java代码
3.网络处理框架
4.JVM
5.操作系统/硬件资源
netty-注意事项
逻辑处理器 = CPU核数 * 2
1.职责链—连接创建之后,会创建对应的pipeline
一个pipeline,创建多个handler
连接越多,handler实例数量越多。对象的回收导致GC压力变大,GC过程Stop the world导致应用出现不稳定【响应时间 忽长忽段】
优化点一:
将公共Handler提出来,优化内存,减少GC次数。(记得标注@Sharable)
红框就是 Sharable Handler,此时请注意:这个Handler不能有公共变量。如果有,会引发多线程问题。
优化点二:
在处理输入请求时,在inboundHandler里面添加线程池,异步处理业务,降低I/O阻塞时长
优化点三:
在线程池业务处理结束时,需要返回。
假设此时有三个线程(T1,T2,T3),他们需要返回的数据包大小分别是(10KB,100KB,10KB),(假设网络返回耗时10K=10ms),如果按照顺序,T1返回耗时10ms(满意),T2返回耗时(10+100 = 110ms)(满意,虽然慢,但数据量大),T3返回耗时(110 + 10 = 120ms)(不满意,数据小,返回时长长)。
优化思路为,将T2的数据包-拆包处理。
T2 -> T2.1,T2.2…T2.10 每个子线程数据包的大小为10KB。
这样,T1返回10ms,T2返回120ms,T3返回30ms。就都满意了
优化点四:
【byteBuf】 – 内存复用、对象复用、零拷贝
netty有一块自己使用的内存区域,不会释放。每次都复用
byteBuf对象复用,第一次接受数据,第二次接受的数据也用相同的byteBuf对象
零拷贝
【1.堆外内存,避免内核空间拷贝到JVM堆】
【2.对象的级别。2个对象和成一个对象,不做复制,做逻辑地址的引用】
byteBuf的对象复用,需要释放 Object msg!