Netty实现原理浅析.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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

文档评论(0)

文档终结者 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档