RPC实战与核心原理
何小锋
京东技术架构部首席架构师
立即订阅
3761 人已学习
课程目录
已更新 8 讲 / 共 28 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
免费
基础篇 (6讲)
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
进阶篇 (1讲)
07 | 架构设计:设计一个灵活的RPC框架
RPC实战与核心原理
登录|注册

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

何小锋 2020-02-26
你好,我是何小锋。在上一讲我讲解了 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《RPC实战与核心原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(17)

  • IO多路复用分为select,poll和epoll,文中描述的应该是select的过程,nigix,redis等使用的是epoll,所以光只看这个文章的话会比较迷惑,文中写的太粗了。
    对于课后思考,目前很多的主流的需要通信的中间件都差不多都实现了零拷贝,如Kfaka,RocketMQ等。kafka的零拷贝是通过java.nio.channels.FileChannel中的transferTo方法来实现的,transferTo方法底层是基于操作系统的sendfile这个system call来实现的。
    2020-03-01
    5
  • 一步
    老师,我理解的IO多路复用,是应用线程一直再调用select,读取内核准备好数据的socket,所以应用线程是阻塞的,但是老师你文章中举的那个例子,不用应用(用户)打电话去询问的,而是内核(餐馆)打电话通知的,在这期间你还可以去干其他的事情,我感觉你这个案例是异步IO非阻塞的
    2020-02-26
    5
    5
  • 川杰
    老师好,有句话不大理解:但它最大的优势在于,用户可以在一个线程内同时处理多个socket的IO请求;
    1、这个线程指的是维护select的线程吗?
    2、为什么用户可以在一个线程内处理多个socket的IO请求?我理解,这里的用户,应该指的是客户端调用方,那么多个socket,应该是指,其他客户端调用方发送过来的、且IO还未准备好的socket,都被放在了这个select里,然后因为这个用户的select调用,某个IO完成的socket被返回了。如果我理解的没错,那应该还是,只处理了一个请求啊?(那个IO完成的socket)

    3、Reactor模式是为了应对高并发场景的,假设一个极端情况:请求A过来,处理IO稍微花了点时间,后面就没有任何请求过来了,那么请求A是不是永远得不到响应了?因为Reactor是时间驱动的,请求A的socket被放在select里了,没有新的事件触发它去返回;
    还是说内核会监视,处理完之后就主动返回给客户端?
    如果内核会主动返回给客户端,那么为什么说:当用户发起了select调用,进程会被阻塞,当发现该select负责的socket有准备好的数据时才返回,之后才发起一次read。
    麻烦解答下,谢谢!
    2020-02-26
    2
    2
  • 阿卧
    阻塞IO:
    1. 阻塞等待:多线程进行IO读取,需要阻塞等待
    2. 内存两次拷贝:从设备(磁盘或者网络)拷贝到用户空间,再从用户空间拷贝到内核空间
    IO多路复用
    1. 一个复用器(selector)监听有多个通道(channel)。实现非阻塞式IO读取、写入
    2. 内存直接拷贝(derict buffers),直接从用户空间拷贝到内核空间
    2020-03-01
  • 安排
    select监视一批socket文件描述符,当某个socket可读或者可写了,那么调用select的线程会被从阻塞中唤醒。这个过程的底层细节是啥啊?比如网卡中断收包,然后中断调用协议栈处理,一直到传输层,然后到socket,发现这个socket是被select监视的,然后将调用select的进程从阻塞队列放到可运行队列,最后在调度点被调度运行。这样理解对吗?
    2020-03-01
  • redj
    老师说:多个网络连接的 IO 可以注册到一个复用器(select)上,当用户进程调用了 select,那么整个进程会被`阻塞`
    既然是非阻塞 + IO多路复用,为什么这里会产生阻塞,阻塞的是内核的进程,还是用户的进程?
    我记得应用进程在没有被通知的情况下,应用进程可以使用 CPU 做其他的事情,应用程序又是怎么腾出手去使用CPU的,如果是阻塞的话?
    有人能帮我解答一下吗,谢谢啦!!!
    2020-02-29
  • redj
    老师的话:多个网络连接的 IO 可以注册到一个复用器(select)上,当用户进程调用了 select,那么整个进程会被阻塞
    2020-02-29
  • Dovelol
    老师好,IO多路复用也是为了解决C10K问题吧,能具体讲一下虚拟内存的作用吗,什么时候会用到,为什么要用。
    2020-02-29
  • 高源
    老师你讲的netty零拷贝不光做到在用户级别的,还有操作系统级别的,那老师如果我想理解它的怎么做的,因为它源代码看的迷糊,怎样把他实现的高技巧和方法运用到自己这块,灵活运用
    2020-02-28
  • yhh
    老师好,请教个问题,我看 零拷贝 虚拟内存 那张图,mmap是也能用于网络io吗?
    2020-02-28
  • 💪😊
    关于网络这块,希望对epoll也进行一下深入对比啊!毕竟不管是nginx netty都使用它进行优化
    2020-02-27
  • 川杰
    接上条,我重新思考了下;应该是这样,这里的事件驱动不是常规的客户端请求,而是指请求处理完后的状态变化,例如,当socket状态变为ready for reading时,相当于触发了新的请求,那么select会找到对应的handler进行调用;
    所以,我刚才举得例子,即使只有一个客户端请求,也会即使的收到服务端的回复;因为这里所谓的event-driven不是指传统意义上的客户端请求的驱动,而是socket经handler处理后状态的变化进行的驱动。
    请问我的理解对吗?
    2020-02-26
    1
  • 一步
    Redis的网络模型就是IO多路复用,但他是单线程的啊,老师文章中说到IO多路复用一般都是多线程进行实现的,这个怎么理解呢?
    2020-02-26
    1
  • 小脚丫
    何老师您好,我是京东员工,看到您这章关于零拷贝的介绍,突然想起来个之前使用jmq的问题想请教您下,Jmq抛出了ERROR com.jd.jmq.common.network.netty.NettyTransport - netty channel exception 10.194.143.76:50088
    io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException这个异常,导致我们应用的堆内存里都是heapbytebuffer这个对象,占用了几个G,之后导致不停的full gc。我们的jmq没有使用直接内存吗? 从现象看,感觉数据都被拷贝到了堆内存中。

    作者回复: 私聊

    2020-02-26
    3
  • Simon
    课后思考: RocketMQ使用mmap实现零拷贝

    作者回复: 这个也是

    2020-02-26
  • 请问.NET Core上有与Netty框架类似的网络通信框架吗?
    请教老师,如果选择用gRPC开发接口服务,从底层原理角度,Java和.NET Core哪个更好呢?
    2020-02-26
    2
  • 张先生
    1.我的理解netty对应用层的零拷贝优化就是把做个tcp包做合并来减少频繁的cpu内核交互,但是cpu内核应该也有个大小限制吧?
    2.零拷贝只是优化了服务器的开销,对于传输层并没有什么优化吧,因为传输层传输的包大小会受链路上路由可接收的包大小决定拆多少个包

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

    2020-02-26
收起评论
17
返回
顶部