RPC 实战与核心原理
何小锋
京东云混合云首席架构师
40244 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
RPC 实战与核心原理
15
15
1.0x
00:00/00:00
登录|注册

04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?

Netty中的零拷贝
什么是零拷贝?
零拷贝
IO多路复用(IO multiplexing)
阻塞IO(blocking IO)
RPC框架在网络通信上倾向选择哪种网络IO模型?
常见的网络IO模型
课后思考
总结
RPC框架中的网络通信
RPC框架中的序列化
网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是何小锋。在上一讲我讲解了 RPC 框架中的序列化,通过上一讲,我们知道由于网络传输的数据都是二进制数据,所以我们要传递对象,就必须将对象进行序列化,而 RPC 框架在序列化的选择上,我们更关注序列化协议的安全性、通用性、兼容性,其次才关注序列化协议的性能、效率、空间开销。承接上一讲,这一讲,我要专门讲解下 RPC 框架中的网络通信,这也是我们在开篇词中就强调过的重要内容。
那么网络通信在 RPC 调用中起到什么作用呢?
我在[第 01 讲] 中讲过,RPC 是解决进程间通信的一种方式。一次 RPC 调用,本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络 IO 发送一条请求消息,服务提供者接收并解析,处理完相关的业务逻辑之后,再发送一条响应消息给服务调用者,服务调用者接收并解析响应消息,处理完相关的响应逻辑,一次 RPC 调用便结束了。可以说,网络通信是整个 RPC 调用流程的基础。

常见的网络 IO 模型

那说到网络通信,就不得不提一下网络 IO 模型。为什么要讲网络 IO 模型呢?因为所谓的两台 PC 机之间的网络通信,实际上就是两台 PC 机对网络 IO 的操作。
常见的网络 IO 模型分为四种:同步阻塞 IO(BIO)、同步非阻塞 IO(NIO)、IO 多路复用和异步非阻塞 IO(AIO)。在这四种 IO 模型中,只有 AIO 为异步 IO,其他都是同步 IO。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了RPC框架在网络通信中选择IO多路复用模型的原因,并详细解释了阻塞IO、IO多路复用以及零拷贝技术。作者指出RPC框架更适合选择IO多路复用,因为它能处理高并发场景,减少线程处理IO请求。此外,文章还介绍了Netty框架中的零拷贝机制,强调了其在用户空间数据操作优化方面的重要性。总结指出,选择IO多路复用和零拷贝技术能提升网络通信效率和应用程序整体性能。读者在开发和使用RPC框架时,应深入了解网络通信原理,尽量做到零拷贝,并合理使用ByteBuf子类,以提升整体性能。整体而言,本文内容涵盖了RPC框架选择IO多路复用的原因以及零拷贝技术的应用,对读者快速了解文章概览并体现了文章的技术特点。

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

全部留言(53)

  • 最新
  • 精选
  • 雨霖铃声声慢
    IO多路复用分为select,poll和epoll,文中描述的应该是select的过程,nigix,redis等使用的是epoll,所以光只看这个文章的话会比较迷惑,文中写的太粗了。 对于课后思考,目前很多的主流的需要通信的中间件都差不多都实现了零拷贝,如Kfaka,RocketMQ等。kafka的零拷贝是通过java.nio.channels.FileChannel中的transferTo方法来实现的,transferTo方法底层是基于操作系统的sendfile这个system call来实现的。

    作者回复: 系统层面零拷贝跟应用层零拷贝还是需要区分的

    2020-03-01
    8
    66
  • 南桥畂翊
    所谓的零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,可以通过一种方式,直接将数据写入内核或从内核中读取数据,再通过 DMA 将内核中的数据拷贝到网卡,或将网卡中的数据 copy 到内核。 老师,上述说直接将数据写入内核或从内核中读取数据,这部分内存不是属于内核态空间的吧?应该说只是一块物理内存,用户态虚拟地址和内核态虚拟地址都作了页表映射

    作者回复: 是不太严谨,已改

    2020-03-24
    30
  • 想出家的小和尚
    老师,直接内存给我的概念很模糊,他指的到底是什么?和jvm中的堆内内存,堆外内存,用户空间,内核空间有什么关系?

    作者回复: 用户空间和内核空间是系统层面划分的;堆内和堆外是针对jvm进程来讲的

    2020-03-31
    4
  • 阿卧
    阻塞IO: 1. 阻塞等待:多线程进行IO读取,需要阻塞等待 2. 内存两次拷贝:从设备(磁盘或者网络)拷贝到用户空间,再从用户空间拷贝到内核空间 IO多路复用 1. 一个复用器(selector)监听有多个通道(channel)。实现非阻塞式IO读取、写入 2. 内存直接拷贝(derict buffers),直接从用户空间拷贝到内核空间

    作者回复: 很棒

    2020-03-01
    2
    3
  • 嘻嘻
    老师,个人理解netty 堆在内存还是在用户态的,还是要拷贝到内核态啊,为啥零拷贝了?

    作者回复: netty里面0更多是buffer类而言

    2020-04-22
    2
    2
  • 番茄炒西红柿
    问一下nio和io多路复用的区别(我认为没区别吧),io多路复用不就是为了实现同步非阻塞?

    作者回复: 本质上多路复用还是同步堵塞的

    2020-04-08
    2
    2
  • 高源
    老师你讲的netty零拷贝不光做到在用户级别的,还有操作系统级别的,那老师如果我想理解它的怎么做的,因为它源代码看的迷糊,怎样把他实现的高技巧和方法运用到自己这块,灵活运用

    作者回复: 看下netty的各常用的ChannlHandler和Bytebuf的实现。

    2020-02-28
    2
  • Mike
    RocketMq中对消息的读取也用到了零拷贝

    作者回复: 是的

    2020-03-31
    1
  • 张先生
    1.我的理解netty对应用层的零拷贝优化就是把做个tcp包做合并来减少频繁的cpu内核交互,但是cpu内核应该也有个大小限制吧? 2.零拷贝只是优化了服务器的开销,对于传输层并没有什么优化吧,因为传输层传输的包大小会受链路上路由可接收的包大小决定拆多少个包

    作者回复: netty零拷贝有多种支持,包括它提供的很多buffer。在进行文件网络传输,也可以进行零拷贝的优化。在网络传输过程中没有优化。

    2020-02-26
    1
  • Jonah
    典型的Kafka,Rocketmq等

    作者回复: 是的

    2020-04-08
收起评论
显示
设置
留言
53
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部