java excutor netty_Netty业务处理线程池的选择

根据我们前面分析的,接收到消息后,为了避免在I/O线程里执行耗时的操作,一般都会使用线程池来执行业务处理逻辑.

那是使用Netty提供给我们的方法,传入一个线程池还是使用我们自己定义的线程池好呢?

先来看Netty给我们提供的

ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler);

即我们添加handler的时候可以传入一个线程池进去

DefaultEventExecutorGroup

它与NioEventLoop之间的区别又是什么?

NioEventLoop

侧重于处理网络I/O相关的各种事件,例如连接操作,消息读取和发送操作

DefaultEventExecutor

侧重于处理业务相关的逻辑,将业务的ChannelHandler与具体的DefaultEventExecutor绑定起来.

6265c5e124f4

EventLoop继承图.png

其次

对于某个客户端连接Channel,只会注册到一个NioEventLoop线程中,用于处理网络I/O操作,业务的ChannelHandler指定了运行线程池EventLoopGroup之后,创建ChannelHandlerContext上下文时会从EventLoopGroup中选择一个EventExecutor绑定到该Channel对应的ChannelHandler实例.

也就是说使用netty提供默认的,是绑定的.如下图

6265c5e124f4

业务绑定EventExecutor模型的线程模型.png

使用我们自己定义的线程池

6265c5e124f4

业务自定义线程池模型的线程模型.png

虽然LinkedBlockQueue通过读写锁来提升性能,但是当业务线程数和写操作比较多时,锁竞争对性能的影响还是比较大的。

如果采用自定义线程池时,优化方向就是锁消除.

可以使用Disruptor或者使用ChannelId与业务线程池中的某个业务进行绑定

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值