本文共 1190 字,大约阅读时间需要 3 分钟。
笔者认为单独讨论Netty的线程模型太抽象,如果能在现实生活中找到一样事物作为类比,那肯定能帮助我们提升对Netty的认识。
笔者曾经利用大学毕业和入职报到的空窗期去餐厅打工体验生活,感想此处不表。餐厅里面有一个司空见惯的现象,一般服务员的数量都会少于餐桌的数量,也就是说,在用餐高峰时期,一个服务员在同一时刻可能会招待不止一桌的客人,这是怎么做到的呢?
首先,我们来仔细分析一下餐厅营业接待客人用餐的流程:
客人M到达餐厅;
前台服务生A接待客人M,确认用餐人数、是否需要排位等等事项;
前台服务生A带领客人M前往用餐区域,并委托给用餐区域服务生B,然后回到前台继续等待后续客人;
服务生B安排客人M落座,点单,期间,服务生A又以相同的方式接待了客人N并委托给了服务生B;
在客人M等待上菜的时间内,服务生B又另起一桌,安排客人N落座、点单;
……
客人M用餐完毕,通知服务生B买单,然后离开餐厅,而此时服务生A还在忙着接待其他客人。
上述流程中,餐厅服务生的职责有两种,前台服务生负责接待,用餐区域服务生负责接待,一般情况下整个用餐期间客人都是在同一张餐桌上,并且都是由同一个服务员招待,而每一个服务员同一时间会招待不止一桌客人,客人用餐期间,服务员会巡视用餐区域,以便及时解决客人的需求。
如果我们将上述的过程用流程图展示出来,可以如下图表示:
那如果我们把里面的实体换成Netty中的组件,再稍加变换这便就是Netty的线程模型了。
如果我们把上图中绿色方框看成一个整体,其实它也是一个EventLoopGroup,原因先卖个关子,后文会有解释。
图中涉及到了几个Netty的核心组件,我们可以先来简单的看一下它的作用:
EventLoop:事件循环,通俗一点的理解,这就是工作线程(注:这种说法是错误的的,准确来说,EventLoop跟一个线程变量绑定)
;
EventLoopGroup:顾名思义,这是一组事件循环,可以看成是个线程池(注:这种说法也是错误的的,准确来说,EventLoopGroup跟一个线程数组绑定)
;
Channel:通道,通俗一点的说法就是服务端处理各种事件的一个场所。
现在我们再来看一遍netty的处理流程:
1,acceptor接受请求,并建立通信链路,完成认证鉴权等处理;
2,acceptor为此连接新建一个channel,将请求委托给EventLoopGroup并继续监听后续请求;
3,从 EventLoopGroup中选出一个 EventLoop与此channel绑定;
4,接下来的服务器与客户端的交互过程就全部在此分配的 EventLoop 中了;
本文以餐厅接待客人的场景类比netty处理请求的过程,希望能给读者有个初步的认识,当然还有很多处理细节没有考虑到,笔者会在后续的文章中继续解释。