博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty框架学习之路(三)—— 初识Netty线程模型
阅读量:4223 次
发布时间:2019-05-26

本文共 1190 字,大约阅读时间需要 3 分钟。

前言

笔者认为单独讨论Netty的线程模型太抽象,如果能在现实生活中找到一样事物作为类比,那肯定能帮助我们提升对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处理请求的过程,希望能给读者有个初步的认识,当然还有很多处理细节没有考虑到,笔者会在后续的文章中继续解释。

你可能感兴趣的文章
sizeof与strlen
查看>>
一个递归+二分法的洗牌程序
查看>>
YUV格式注释
查看>>
一维、二维数组传参
查看>>
判断当前时间的下一秒是多少
查看>>
从文本文件中读取数据排序并输出到文本
查看>>
求一个整数数组中第二大的数
查看>>
删除一个链表中的节点
查看>>
计算机网络面试整理【转】
查看>>
编译过程的五个阶段
查看>>
Linux系统中的fork()函数详解
查看>>
TCP/IP总结
查看>>
WireShark使用教程
查看>>
UDP总结
查看>>
为什么不能建立引用数组?
查看>>
Union的一个知识点
查看>>
基类析构函数为虚函数的研究
查看>>
函数入栈出栈以及栈帧
查看>>
从RTTI谈C++的向下转型
查看>>
面试心得(BAT)
查看>>