一起学netty(8)EventLoop和EventLoopGroup理解

weblog 1457 0 0

之前的文章中提到过,单线程的nio模型任然有一定缺点。在上一节《一起学netty(7)netty的线程模型》中也提到,netty的出现,封装了nio复杂的代码,并且介入多线程来处理事件,最大限度的提高了效率。

本文我们继续探究EventLoop、EventLoopGroup的概念以及和nio代码之间的关系。

EventLoop

EventLoop是一个事件循环对象,本质上是一个单线程的执行器(其中维护了一个Selector多路复用器)用于处理io事件。两外它实现了ScheduledExecutorService接口,所以它包含有关线程池的方法。

EventLoopGroup

EventLoopGroup是一个事件循环组,可以看作一个线程池,它包含一组EventLoop一组事件循环对象。

netty模型图

netty线程模型图

在netty的入门代码中,首先就定义了两个事件循环组。

 //创建两个事件循环组bossGroup和workGroup,含有的子线程NioEventLoop的个数默认为cpu核心数的两倍。
        //bossGroup只处理连接请求,workGroup处理客户端消息收发的业务。
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workGroup = new NioEventLoopGroup(8);
        //服务端对象
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        //绑定线程组
        serverBootstrap.group(bossGroup,workGroup)
                //使用NioServerSocketChannel作为服务器的通道实现
                .channel(NioServerSocketChannel.class)
                ...

其中bossGroup就对应了上图的Boss Group,workGroup 就对应了上图的Work Group。  

在netty的线程模型中采用的是主从多线程模型,上图中Boss Group上有一个EventLoop,该事件循环对象上绑定了一个多路复用器Selector,专门用于处理客户端的连接事件。当连接建立完成后,会产生一个SocketChannel,然后该SocketChannel会被注册到Work Group上的其中一个EventLoop事件循环对象上,该事件循环对象也会绑定一个Selector多路复用器,专门用于处理客户端的数据收发等事件。其中每个事件循环对象都可能会绑定多个SocketChannel。那么这样的效率就会比较高。

对比nio程序如下

一般客户端连接事件并发量较少,处理起来交简单,所以一般用一个或很少几个线程就能解决。

而客户端数据收发比较频繁,所以一般需要的线程数也就是EventLoop比较多一点。


猜你喜欢
official 1435 个Pipeline。入栈处器通常是ChannelInboundHandlerAdapter的子类,主要用于读取客户端的数据。(包括数据包码,业务逻辑处等)出栈处器通常是ChannelO
official 1481 编码器码器在网络应用中需要实现某种编码器,将原始字节数据与自定义的消息对象进行互相转换。网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行
official 1932 篇《netty(2)nio模型及多路复用器》中已经简单介绍了nio模型,以及多路复用器的概念,并了nio是非阻塞的网络模型,以及与bio的区别。本篇将继续深入nio,以及select
official 1054 ChannelInboundHandlerChannelInboundHandler是入栈消息处的核心接口,如下
official 1205 什么是心跳?顾名思义,所谓心跳,即在TCP长连接中,客户端服务器之间定期发送的种特殊的数据包,通知对方自己还在线,以确保TCP连接的有效性。为什么需要心跳?因为网络的不可靠性,有可能在TCP保持
official 1379 之前的文章中提到了java中的nio是同步非阻塞的网络io模型,本文就主要说明下同步、异步、阻塞、非阻塞的概念来帮助nio。io操作IO分两阶段(旦拿到数据后就变成了数据操作,不再是IO
official 1146 。ServiceSocketChannel本身不具备数据传输的能力,它只能监听新进来的TCP链接通道。当有新的TCP链接通道建立后,它会创建个SocketChannel的对象,代表客户端的唯连接通道
official 1158 UpdaterequestHTTP包建立连接,之后的通信全部使用websocket自己的协议,就http没啥关系了。有兴趣的同可以多了下websocket协议报文的详细信息。Netty实现websoc
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。