netty的线程模型, 调优 及 献上写过注释的源码工程(1),2024年最新php毕业设计新颖题目

当同步事件分离器发现了某个handle的状态发生了改变, 比如它的状态变成了ready, 就说明这个handle中发生了感兴趣的事件, 这时, 同步事件分离器会将这个handle的情况告诉Reactor , Reactor进一步用这个handle当成key, 获取出相对应的 EventHandler 开始方法的回调…

如何实现单机百万性能调优#

​ 当我们进行socket编程时, 我们得给Server端绑定上一个端口号, 客户端一般会被自动分配Server所在的机器上的一个端口号, 区间一般是1025-65535之间, 这样看上去, 即使服务器的性能再强, 即使netty再快, 并发数目都被操作系统的特性限制的死死的

突破局部文件句柄的限制#

​ 像 windows中的句柄或者是linux的文件描述符 这种能打开的资源的数量是有限的, 每一个socket连接都是一个句柄或者是描述符, 换句话说, 这一个特性限制了socket连接数, 也就限制了并发数

查看linux系统中一个进程能打开的单个文件数,(它限制了单个jvm能打开的文件描述符数,每一个tcp连接对linux来说都是一个文件)

Copy

ulimit -n

修改这个限制:

Copy

# 在 /etc/security/limits.conf 追加以下内容 , 表示任何用户的链接最多都能打开100万个文件 * hard nofile 100000 * soft nofile 100000

重启机器生效:

突破全局文件句柄的限制#

查看当前系统中的全局文件句柄数

Copy

cat /proc/sys/fs/file-max

修改这个配置

Copy

# 在 /etc/sysctl.conf 中追加如下的内容 fs.file-max = 1000000

虚拟机参数的经验值#

Copy

# 堆内存 -Xms6.5g -Xmx6.5g # 新生代的内存 -XX:NewSize=5.5g -XXMaxNewSize=5.5g # 对外内存 -XX: MaxDirectMemorySize=1g

应用级别的性能调优#

问题:#

​ Netty基于Reactor这种线程模型的, 进行非阻塞式编程, 一般我们在编写服务端的代码时, 都会在 往 服务端的Channel pipeline上添加大量的 入站出站处理器, 客户端的消息一般我们都是在 handler中的 ChannelRead() 或者是 ChannelRead0() 中取出来, 再和后台的业务逻辑结合

客户端的消息,会从Pipeline这个双向链表中的header中开始往后传播, 一直到tail, 这其实是个责任链

这时, 如果我们将耗时的操作放在这些处理器中, 毫无疑问, nettey会被拖垮, 系统的并发量也提升不上去

解决方式一:#

新开辟一个线程池 , 将耗时的业务逻辑放到新开辟的业务去执行

Copy

public class MyThreadPoolHandler extends SimpleChannelInboundHandler<String> { private static ExecutorService threadPool = Executors.newFixedThreadPool(20); @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { threadPool.submit(() -> { Object result = searchFromMysql(msg); ctx.writeAndFlush(ctx); }); } public Object searchFromMysql(String msg) { Object obj = null; // todo obj = return obj; } }

解决方式二:#

netty 提供的一种原生的解决方式, netty可以将我们的handler 放到一个专门的线程池中去处理

Copy

public class MyInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 业务线程池 NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(20); // 使用这个重载的方法,给handler指定线程池去执行 pipeline.addLast(eventLoopGroup,new MyHandler()); } }

Netty带给我的收获#

能立即成为Netty的领域的大佬吗?#

No!

​ 读过Netty的代码,真的并不意味着即刻成为一个netty领域的大佬,相反读的我发慌, 这么庞大的知识体系, 得用多久去慢慢消化, 我们看到的大佬要么是天才, 要么是在自己多年的使用经验里面历练出来的, 想在netty这个领域有所建树,真的是需要不断是去实践,真的得用多年的工作经验去总结才行!也许这样才可能发自内心的感触到netty为什么要这么实现, 如果想着立即多厉害, 也许是做梦了…

真的熟练掌握了Netty吗?#

No!

​ 读过netty, 也并不是意味着可以了解netty整个领域的方方面面, 以及如何恰当的使用netty去解决我们的业务需求, 站在一个学生的角度来看, 这一点我心里感觉的特别深刻, 同样的东西,比如同一个ArrayList, 大家都在用, 但是对它的掌握程度的差距甚至能达到使人瞠目结舌的地步, 不得不承认, 技术是需要时间去积累, 需要时间去消化的东西,就像尘封的酒,越酿越香

有什么收获?#

​ 当然,读源码也不是没有用,起码对netty框架整体的架构不是那么是陌生了,当自己遇到bug时,也敢于点开源码去找原因了,这应该是我最大的收获

献上注解过的Netty源码工程#

​ 当时我在学netty时, 是从github上拉取的netty原生工程, 然后在本地重新编译运行, 这样我就能在源码工程中写注解, 记笔记…

todo
​ 在这个工程里面大概写了 1400 多行注释(所有的笔记都打上了todo 高亮标记) , 也翻译了一些类和方法上的文档和注释, 不能说百分百正确, 但是这个过程也是挺走心的, 比如netty是如何解决JDK空轮询的bug的? 这些在代码中都是有迹可循的,如下
空轮询bug

另外一个学习的感触就是忘东西, 还有就是随着时间的推移, 接触到技术会越来越多, 确实很难在同一个时间将学的所有的技术都提升到最高的熟练程度, 好处也有, 可能原来学用了一个星期, 现在重新看只要1天就够了

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

356374)]

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-u9Km4R9b-1712529356375)]

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值