中间件核心技术与实战
丁威
中通快递资深架构师,RocketMQ 社区首席布道师
19674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
中间件核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

07 | NIO:手撸一个简易的主从多Reactor线程模型

你好,我是丁威。
中间件是互联网发展的产物,而互联网有一个非常显著的特点:集群部署、分布式部署。当越来越多的服务节点分布在不同的机器上,高效地进行网络传输就变得更加迫切了。在这之后,一大批网络编程类库如雨后春笋般出现,经过不断的实践表明,Netty 框架几乎成为了网络编程领域的不二之选。
接下来的两节课,我们会通过对 NIO 与 Netty 的详细解读,让你对网络编程有一个更直观的认识。

NIO 和 BIO 模型的工作机制

NIO 是什么呢?简单来说,NIO 就是一种新型 IO 编程模式,它的特点是同步非阻塞
很多资料将 NIO 中的“N”翻译为 New,即新型 IO 模型,既然有新型的 IO 模式,那当然也存在中老型的 IO 模型,这就是 BIO,同步阻塞 IO 模型。
定义往往是枯燥的,我们结合实际场景看一下 BIO 和 NIO 两种 IO 通讯模式的工作机制,更直观地感受一下它们的差异。
MySQL 的客户端 (mysql-connector-java) 采用的就是 BIO 模式,它的工作机制如下图所示:
我们模拟场景,向 MySQL 服务端查询表中的数据,这时会经过四个步骤。
第一步,应用程序拼接 SQL,然后 mysql-connector-java 会将 SQL 语句按照 MySQL 通讯协议编码成二进制,通过网络 API 将数据写入到网络中进行传输。底层最终是使用 Socket 的 OutputStream 的 write 与 flush 这两个方法实现的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了NIO和BIO两种IO通讯模式的工作机制,并通过模拟MySQL客户端采用BIO和NIO与MySQL服务端通信的过程,展现了它们在等待数据阶段和数据传输阶段的差异。同时,文章还介绍了Reactor线程模型,深入探讨了NIO的理论知识。通过对核心类的核心代码和线程模型的具体实现进行解读,读者能够更深入地理解NIO实现Reactor模型的内涵。整体而言,本文为读者提供了深入了解NIO和Reactor模型的机会,是一篇值得阅读的技术文章。文章内容涵盖了BIO和NIO两种网络编程模型的特点,以及主从多Reactor模型的设计理念,为读者提供了全面的技术知识。文章还提出了两道课后题,引导读者进一步思考和实践。通过本文的阅读,读者可以快速了解NIO和Reactor模型的工作原理,以及如何应用于实际场景中。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《中间件核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • open!?
    问题一 :请求体很大 当前subreactor线程耗时会比较久 这时如果有别的channel来请求到当前subreactor线程会阻塞很久吧 不知道对不对

    作者回复: 非常正确的,但Netty在这方面对这个问题做了处理。它的处理方法是就是控制一个通道在一次事件选择处理中,控制调用read方法的次数,默认为16次,也就是如果请求体太大,以至于16次读调用还无法读完,这个通道就不再处理,将时间给其他通道,等下一次读时间触发时,再继续读。

    2022-11-22归属地:浙江
    1
  • 呢喃
    写的非常好,对我很有帮助,感谢老师

    作者回复: 谢谢认可,我建议看过后,自己后面再写一遍,然后再看netty是怎么写的,最后再来优化一遍,完成这个过程,我相信对nio的理解会更透彻。

    2022-07-31归属地:上海
    1
  • 雨落~紫竹
    网络传输涉及带宽 就算你是nio 你也必须过带宽吧 木桶效应?

    作者回复: 你好,我不太明白你的疑问点是什么?网络传输必须要涉及带宽。NIO的核心优势其实就是其事件选择机制,比NIO少耗费线程资源,因为在操作系统层面进行事件就序选择后,只需要处理真正有需求的网络通道。

    2022-07-03
    4
  • William Ning
    建议参考文档,对照着学习,思考 https://time.geekbang.org/column/article/8697 -- 18 | 单服务器高性能模式:PPC与TPC https://time.geekbang.org/column/article/8805 -- 19 | 单服务器高性能模式:Reactor与Proactor
    2022-07-10
    2
  • InfoQ_09e721f0120c
    mainReactor只是用于建立连接,为什么要用线程池?一个线程不够吗?
    2024-02-06归属地:湖北
  • 哲里哲里
    建议吧图文结合起来,比如那段文字是描述图中哪个过程
    2022-10-20归属地:上海
  • William Ning
    老师同学好,全是java代码,不过注释还是比较清晰。 但是关于NioClient 类中 // 再次发送消息,重复输出 buffer = ByteBuffer.allocate(1024); buffer.put("hello server.".getBytes()); buffer.flip(); sc.write(buffer); 没明白,为什么在读取数据的代码里,还要写入数据?
    2022-07-11
    1
  • William Ning
    FYI OP_CONNECT OP是Operation。
    2022-07-11
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部