Netty事件循环--无锁化

本文介绍了Netty的事件循环机制及其与JavaScript单线程模型的相似之处。Netty使用EventLoop来处理Channel的I/O操作,每个客户端连接只注册到一个NioEventLoop上,确保线程安全并简化开发。文章还探讨了Netty的串行处理策略及优势,并给出了编程开发的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Netty的事件循环机制跟–javascipt的单线程模型相同。

一个EventLoopGroup具有一个或多个EventLoop,EventLoop作为一个Thread给Channel执行工作。当创建一个Channel,Netty通过一个单独的EventLoop实例来注册该Channel,这就是你的应用程序不需要同步Netty的I/O操作;所有Channel的I/0操作始终用相同的线程来执行。

这里写图片描述

netty的串行处理策略

Netty的处理策略是每当有一个新的客户端接入,则NioEventLoop 线程组中顺序获取一个可用的NioEventLoop,当到达数组上限之后,重新返回到0,通过这种方式,可以基本保证各个NioEventLoop的负载均衡。一个客户端连接只注册到一个NioEventLoop上,这样就避免了多个IO线程去并发操作它。

netty串行处理的优势

  1. 降低用户开发难度,提升处理性能
  2. 避免上下午切换和并发保护带来的额外性能

netty编程开发最佳实践

时间可控的简单业务直接在IO线程上处理

如果业务非常简单,执行时间非常短,不需要与外部网元交互、访问数据库和磁盘,不需要等待其它资源,则建议直接在业务ChannelHandler中执行。

时间不可控业务建议投递到后端业务线程池统一处理

对于此类业务,不建议在ChannelHandler中启动线程或者线程池处理,建议将不同的业务统一封装成task,统一投递到后端业务线程池中进行统一处理。

  static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
 ...

 ChannelPipeline pipeline = ch.pipeline();

 pipeline.addLast("decoder", new MyProtocolDecoder());
 pipeline.addLast("encoder", new MyProtocolEncoder());
 //耗时任务在独立的线程池中进行
 pipeline.addLast(group, "handler", new     MyBusinessLogicHandler());
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值