上次讲到事件驱动模式,今天咱们来好好分析下netty的事件模式的几个类型。react
先从NIO讲起,vim
JAVA NIO方面Selector给Reactor模式提供了基础,Netty结合Selector和Reactor模式设计了高效的线程模型。网络
这里有个题外话,reactor英文的含义是什么?咱们能够稍微了解下:多线程
中文翻译是反应者,在咱们这个语境,翻译成反应者或响应者,都是正解。就把它想象成KFC的前台服务员好,她就是一个响应者,也叫reactor.socket
如今咱们来看下Reactor模式图:oop
如上图所示,所谓的reactor模式,就是咱们上篇文章所说的,KFC先后服务员加后台服务员的模式。spa
前台服务员(同时表明上图的demultiplexer和dispatcher)只负责接待客户的点汉堡的请求和订单分派,作汉堡的活让后台台服务员(表明上图的handler)去作。线程
作好后,后台再通知前台,由前台转交给客户。翻译
这个很好理解。设计
好,那咱们如今来看看Java NIO的reactor的几个模式:单线程模式,多线程模式,主从模式。
先看单线程模式:
如上图所示,所谓单线程模式,只有一个线程(acceptor)去处理客户的请求,而后,这个线程还要作read,send等工做,至关因而个多面手。
就好像KFC前台后台都只有一个服务员。
这个模式,若是客户只有一个的话,是能够处理。但若是,是用餐高峰期,一会儿来了十个客户,那就很差处理了。
怎么办?
很天然,咱们能够增长后台服务员,而且由于后台的工做比较多,后台服务员能够多个。这就是多线程模式。
再看多线程模式图:
如上图所示,用线程池(多个服务员)去处理read,decode,compute,encode任务。
就好像,前台一个服务员只负责下订单,而后把订单信息分派给多个后台服务员,同时服务多个客户,速度和效率也明显好不少,客户也不用等待过久。
那若是,这个时间来了几十个客户,若是只有一个前台服务员,这时,也处理不过来,怎么办?
很天然,增长前台服务员的数量。固然咱们也不须要增长太多(毕竟有人力成本),如今咱们只增长一位好了。
两位服务员,一主一从,咱们就叫主从模式。
咱们来看主从模式图:
如上图,将Reactor分红两部分,mainReactor负责监听server socket,accept新链接;并将创建的socket分派给subReactor。subReactor负责多路分离已链接的socket,读写网络数据,对业务处理功能,其扔给worker线程池完成。一般,subReactor个数上可与CPU个数等同。
仍是用KFC的例子来讲明,其中mainReactor是服务员小黄,她只负责下订单。subReactor就是服务员小张,他呢,只服务根据订单信息分派给后台服务员,并负责把汉堡和饮料放在托盘递给客户。
以上就是reactor模式说明,但愿你已经明白了!
说完了Reactor的三种模型,那么Netty是哪种呢?其实Netty的线程模型是Reactor模型的变种,那就是去掉线程池的第三种形式的变种,这也是Netty NIO的默认模式。Netty中Reactor模式的参与者主要有下面一些组件:
Selector
EventLoopGroup/EventLoop
ChannelPipeline
Selector即为NIO中提供的SelectableChannel多路复用器,充当着demultiplexer的角色,就像专门下订单的前台服务员。
ChannelPipeline负责安排Handler的顺序及其执行。由于后台工做多且杂,须要一个后台管理员负责管理和编排后台服务员的工做。这个后台管理员就是ChannelPipeline。
EventLoop的目的是为Channel处理IO操做,一个EventLoop能够为多个Channel服务。EventLoop就是后台服务员,一个后台服务员能够同时作几份汉堡。
EventLoopGroup会包含多个EventLoop。EventLoopGroup就是后台服务员的班组,几个后台服务员一个班组,一个班组固定处理一个固定 的后台工做。
明天继续。
s