zoukankan      html  css  js  c++  java
  • 选择Netty的理由

    摘自:http://blog.csdn.net/u010154380/article/details/64443762

    《Netty 权威指南》—— 选择Netty的理由

    声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。

    在开始本节之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果2个多月过去了,他们的NIO服务端始终无法稳定,问题频出。由于NIO通信是它们的核心组件之一,因此,项目的进度受到了严重的影响,领导对此非常恼火。另一个项目组直接使用Netty作为NIO服务端,业务的定制开发工作量非常小,测试表明,功能和性能都完全达标,项目组几乎没有在NIO服务端上花费额外的时间和精力,项目进展也非常顺利。

    这两个项目组的不同遭遇提醒我们:开发出高质量的NIO程序并不是一件简单的事情,除去NIO固有的复杂性和BUG不谈,作为一个NIO服务端需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等等,如果你没有足够的NIO编程经验积累,一个NIO框架的稳定往往需要半年甚至更长的时间。更为糟糕的是一旦在生产环境中发生问题,往往会导致跨节点的服务调用中断,严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非正常停机会带来巨大的损失。

    从可维护性角度看,由于NIO采用了异步非阻塞编程模型,而且是一个IO线程处理多条链路,它的调试和跟踪非常麻烦,特别是生产环境中的问题,我们无法有效调试和跟踪,往往只能靠一些日志来辅助分析,定位难度很大。

    2.6.1.不选择JAVA原生NIO编程的原因

    在本小节,我们总结下为什么不建议开发者直接使用JDK的NIO类库进行开发的原因:

    1) NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等;

    2) 需要具备其它的额外技能做铺垫,例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序;

    3) 可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大;

    4) JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该bug发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单如下:

    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933

    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719

    异常堆栈如下: 
    01 
    java.lang.Thread.State: RUNNABLE 
    02 
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 
    03 
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210) 
    04 
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65) 
    05 
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69) 
    06 
    - locked <0x0000000750928190> (a sun.nio.ch.Util2)  
    07  
                - locked <0x00000007509281a8> (a java.util.Collections2)  07              - locked <0x00000007509281a8> (a java.util.CollectionsUnmodifiableSet) 
    08 
    - locked <0x0000000750946098> (a sun.nio.ch.EPollSelectorImpl) 
    09 
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80) 
    10 
    at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:217) 
    11 
    at net.spy.memcached.MemcachedConnection.run(MemcachedConnection.java:836)

    由于上述原因,在大多数场景下,我不建议大家直接使用JDK的NIO类库,除非你精通NIO编程或者有特殊的需求,在绝大多数的业务场景中,我们可以使用NIO框架Netty来进行NIO编程,它既可以作为客户端也可以作为服务端,同时支持UDP和异步文件传输,功能非常强大。

    下个小节我们就看看为什么选择Netty作为基础通信框架。 
    2.6.2.为什么选择Netty

    Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如Hadoop的RPC框架avro使用Netty作为底层通信框架。很多其它业界主流的RPC框架,也使用Netty来构建高性能的异步通信能力。

    通过对Netty的分析,我们将它的优点总结如下:

    1) API使用简单,开发门槛低;

    2) 功能强大,预置了多种编解码功能,支持多种主流协议;

    3) 定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展;

    4) 性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优;

    5) 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;

    6) 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会被加入;

    7) 经历了大规模的商业应用考验,质量已经得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它可以完全满足不同行业的商业应用。

    正是因为这些优点,Netty逐渐成为Java NIO编程的首选框架。 
    2.7 .总结

    本章通过一个简单的demo开发-时间服务器程序,让大家熟悉传统的同步阻塞IO、伪异步IO、非阻塞IO(NIO)和异步IO(AIO)的编程和使用差异。然后对比了各自的优缺点,给出了使用建议。

    最后,我们详细介绍了为什么不建议读者朋友们直接使用JDK的NIO原生类库进行异步IO的开发,同时对Netty的优点进行分析和总结,给出使用Netty进行NIO开发的理由。

    相信学完本章之后,大家对Java的网络编程已经有了初步的认识,从下一个章节开始,我们正式进入Netty的世界,学习和掌握基于Netty的网络开发。

  • 相关阅读:
    训练总结
    图论--最短路--SPFA模板(能过题,真没错的模板)
    图论--最短路-- Dijkstra模板(目前见到的最好用的)
    The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
    关于RMQ问题的四种解法
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
    ZOJ 3607 Lazier Salesgirl (枚举)
    ZOJ 3605 Find the Marble(dp)
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/8617773.html
Copyright © 2011-2022 走看看