网络编程项目实战-Netty实践分享-江河计划

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!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值