文档详情

Netty实现原理浅析.pdf

发布:2018-12-26约8.99千字共11页下载文档
文本预览下载声明
Netty实现原理浅析 Netty是JBoss 出品的高效的JavaNIO开发框架,关于其使用,可参考我的另 一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西,由于精力 有限,本人并没有对其源码做了极细致的研 究。如果下面的内容有错误或不严 谨的地方,也请指正和谅解。对于Netty使用者来说,Netty提供了几个典型的 example,并有详尽的APIdoc和guide doc,本文的一些内容及图示也来自于 Netty 的文档,特此致谢。 1、总体结构 先放上一张漂亮的Netty总体结构图,下面的内容也主要围绕该图上的一些核心 功能做分析,但对如ContainerIntegration及SecuritySupport等高级可选 功能,本文不予分析。 2、网络模型 Netty是典型的Reactor模型结构,关于Reactor 的详尽阐释,可参考POSA2, 这里不做概念性的解释。而应用JavaNIO构建Reactor模式,DougLea (就是 那位让人无限景仰的大爷)在 “ScalableIOinJava”中给了很好的阐述。这 里截取其PPT 中经典的图例说明 Reactor模式的典型实现: 1、这是最简单的单Reactor单线程模型。Reactor线程是个多面手,负责多路 分离套接字,Accept新连接,并分派请求到处理器链中。该模型 适用于处理器 链中业务处理组件能快速完成的场景。不过,这种单线程模型不能充分利用多核 资源,所以实际使用的不多。 2、相比上一种模型,该模型在处理器链部分采用了多线程 (线程池),也是后 端程序常用的模型。 3、 第三种模型比起第二种模型,是将Reactor分成两部分,mainReactor负责 监听serversocket,accept新连接,并将建立的socket分派给subReactor。 subReactor负责多路分离已连接的socket,读写网 络数据,对业务处理功能, 其扔给worker线程池完成。通常,subReactor个数上可与CPU个数等同。 说完Reacotr模型的三种形式,那么Netty是哪种呢?其实,我还有一种Reactor 模型的变种没说,那就是去掉线程池的第三种形式的变种,这也 是Netty NIO 的默认模式。在实现上,Netty 中的Boss类充当mainReactor,NioWorker类充 当subReactor (默认 NioWorker 的个数是 Runtime.getRuntime().availableProcessors())。在处理新来的请求 时, NioWorker读完已收到的数据到ChannelBuffer 中,之后触发ChannelPipeline 中的ChannelHandler流。 Netty是事件驱动的,可以通过ChannelHandler链来控制执行流向。因为 ChannelHandler链的执行过程是在 subReactor中同步的,所以如果业务处理 handler耗时长,将严重影响可支持的并发数。这种模型适合于像Memcache这 样的应用场景,但 对需要操作数据库或者和其他模块阻塞交互的系统就不是很 合适。Netty 的可扩展性非常好,而像ChannelHandler线程池化的需要,可以 通过在 ChannelPipeline 中添加Netty 内置的ChannelHandler实现类 –ExecutionHandler实现,对使用者来说只是 添加一行代码而已。对于 ExecutionHandler需要的线程池模型,Netty提供了两种可 选:1) MemoryAwareThreadPoolExecutor 可控制Executor中待处理任务的上限 (超过 上限时,后续进来的任务将被阻 塞),并可控制单个Channel待处理任务的上 限;2) OrderedMemoryAwareThreadPoolExecutor 是 MemoryAwareThreadPoolExecutor 的子类,它还可以保证同一Channel 中处 理的事件流的顺序性,这主要是控制事件在异步处 理模式下可能出现的错误的 事件顺序,但它并不保证同一Channel 中的事件都在一个线程中执行(通常也没 必要)。一般来 说,OrderedMemoryAwareThreadOrderedMemoryAwareThreadPoolExecutor 是是个个很很不不错错的的选选 择,当然,如果有需要,,也可以DIY一个。 3、 buffer ty.buffer包的接口及类的结构图如下: 该包核心的接口是ChannelBufferChan
显示全部
相似文档