美文网首页
boy-learning-netty | 02 为什么舍近求远:

boy-learning-netty | 02 为什么舍近求远:

作者: BruceOuyang | 来源:发表于2019-10-17 17:08 被阅读0次

    相关源码:boy-learning-netty
    个人博客:http://bruce.bugmakers.club
    内容来自《极客时间 - Netty源码剖析与实战》

    为什么舍近求远:不直接使用 JDK NIO

    • Netty 做的更多

    • Netty 做的更好

    • 自己在 NIO 上研发难度非常大

    Netty 做的更多

    • 支持常用应用协议层(http/tcp/udp)

    • 解决传输问题:粘包、半包现象(tcp 容易出现这两个问题,nio不会处理这些问题,netty会)

    • 支持流量整形(流量控制、黑白名单)

    • 完善的断连、Idle(空闲)等异常处理

    Netty 做的更好

    1、规避JDK NIO bug

    • 经典的 epoll bug:异常唤醒空转导致 CPU 100%
      jdk6 linux 2.4 _ jdk 不修复,netty 规避

    • IP_TOS 参数(IP 包的优先级和 QoS 选项)使用时抛出异常
      jdk12 解决,netty 规避

    2、API 更友好更强大

    • JDK 的 NIO 一些 API 不够友好,功能薄弱,例如 ByteBuffer -> Netty's ByteBuf
      ByteBuffer: 内部实现是一个final的字节数组,不可以扩容,只有一个指针维护他的状态,在读写切换操作的时候需要一个额外的操作(sleep)
      ByteBuf: 有两个指针对应读写操作,可扩容

    • 除了 NIO 外,也提供了其他一些增强:ThreadLocal -> Netty's FastThreadLocal

    3、隔离变化、屏蔽细节

    • 隔离 JDK NIO 的实现变化: nio -> nio2(aio) -> ...

    • 屏蔽 JDK NIO 的实现细节

    自己直接使用 JDK NIO 实现的可能性?

    • 大概些多少行代码
      Netty Transport Package: source code lines 18584

    • 可能面对的问题: 400 open, 4347 closed(2019/09 统计)

    • "踏平" 多少 JDK NIO bug:5654

    • 未来能维护多久?Netty 已经维护 15 年(from 2004 to 2019)

    直接使用 NIO = 一个人在战斗

    相关文章

      网友评论

          本文标题:boy-learning-netty | 02 为什么舍近求远:

          本文链接:https://www.haomeiwen.com/subject/qndvmctx.html