本文旨在通过一个实际工作中例子让大家理解线程模型的演变,从而对 Netty 的模型有一个粗略的印象,面向的是想初步了解 Netty 原理的读者,而并不关心具体的执行细节和相关术语的描述。
单线程
单线程映射到我们的实际工作中就是由一个人完成所有的工作,如下图所示:
A 自己独立的完成全部的Job
多线程
多线程映射到我们的工作中就是多个人共同协作完成工作,如下图所示:
A、B、C 三人工作完成工作,每个人会分到具体的工作去执行,较之单线程,执行效率提高。
线程池
多个 Worker(A、B、C等)已经准备好去完成即将到来的Job,当Job 1过来的时候,会从线程池中选择一个线程也就是Worker(A)来完成这项任务,完成之后A仍然要回到线程池中,等待下一个工作的到来。
Reactor单线程模型
Reactor 的单线程模型映射到实际工作中如下图所示:
我们有一个Boss来接收具体的Job,然后Boss将具体接收到的Job分配给已经准备好的Worker,交给具体的Worker来完成最终的Job,但是如果Job非常多的时候,Boss的压力就会越来越大,所以Boss成为了性能的瓶颈,而下面提到的Reactor多线程模型就是为了解决这个问题而产生的。
Reactor多线程模型
为了完善Reactor单线程模型,Reactor多线程模型进行了优化:
和Reactor单线程模型相比,Reactor多线程模型增加了一个从Manager pool选择Manager(相当于项目经理)的过程,即通过Manager来帮助Boss分配具体的Job给Worker,例如图中选择了M1,那么M1就会去完成选择Worker的工作,虚线代表选择了M2或者M3。
Netty的具体实现就类似于Reactor的多线程模型,而Spark现在Rpc的底层就是通过Netty来实现的。
至此本文的目的已经达到,如果想要更加详细的了解Netty的具体实现细节和NIO相关的知识可以参考如下文章:
本文为原创,欢迎转载,转载请注明出处、作者,谢谢!