Netty之模型分析

1.网络模型

Netty实现了非常经典的多reactor模型其中mainReactor是对应的Boss类,它负责接收客户端新来的连接。它使用了线程池1,有多个Boss对象供绑定多个地址进行监听,这些地址均匀分配到各个Boss上。默认只使用一个Boss对象监听。

subReactor对应Worker类,它负责监听由Boss类accept的socket的读写事件。它使用了另外一个线程池2,有多个Worker类处理这些socket,socket均匀分布在各个worker上。每个worker线程读取消息后,同步调用相应的解码、处理器,待处理完毕后才返回。因此如果业务处理器是非常耗时的非计算密集形操作,如DB操作,worker线程的同步操作严重影响性能。因此这些耗时操作适合放置到线程池3中。

ExcutorHandler类是一个异步处理类,它包含一个线程池3,在Worker读取消息后将消息以任务的形式交给ExecutorHandler,它会把这任务加入到线程池中并令worker线程立即返回。 

2.线程模型

在第1点中介绍了网络模型,其它包括3个线程池,其中与Worker相对的线程池2称为IO线程,其余线程均为非IO线程。从socket读消息操作自然是在IO线程中执行,在读取消息时可能将消息放入消息处理线程池中执行,或者在TimeIdlerHandler定时器超时执行的操作,这些操作后如果有数据要写入worker中的socket,这时因此执行这些操作的线程并非是IO线程,Netty会将这些操作以任务的形式加入到worker的任务队列并唤醒worker,让IO线程来执行这些write操作。



 

3.异步事件驱动模型

每个Channel有一个Pipeline,Pipeline内有两条由Handler构成的处理链,upstream一般处理读事件,downstream一般处理写事件。downstream末端由ChannelSinkt处理。通过ChannelEvent可以获取ChannelFuture立即返回而不需要等待消息处理完毕,向其添加监听器即可在事件处理完毕后执行相关的操作。



 

猜你喜欢

转载自xklin04.iteye.com/blog/1874080