RPC-client异步回调原理

2023-11-08

RPC-client异步回调原理
见下面的设计图:
所谓异步回调,在得到结果之前,不会处于阻塞状态,理论上任何时间都没有任何线程处于阻塞状态,因此异步回调的模型,理论上只需要很少的工作线程与服务连接就能够达到很高的吞吐量。
 
上图中左边的框框,是少量工作线程(少数几个就行了)进行调用与回调。
中间粉色的框框,代表了RPC-client组件。
右边橙色框,代表了RPC-server。
蓝色六个小框,代表了异步RPC-client六个核心组件:上下文管理器,超时管理器,序列化组件,下游收发队列,下游收发线程,连接池组件。
白色的流程小框,以及箭头序号1-17,代表整个工作线程的串行执行步骤:
1)业务代码发起异步RPC调用,Add(Obj1,Obj2, callback)
2)上下文管理器,将请求,回调,上下文存储起来
3)序列化组件,将对象调用序列化成二进制字节流,可理解为一个待发送的包packet1
4)下游收发队列,将报文放入“待发送队列”,此时调用返回,不会阻塞工作线程
5)下游收发线程,将报文从“待发送队列”中取出,通过连接池组件拿到一个可用的连接connection
6)通过连接connection将包packet1发送给RPC-server
7)发送包在网络传输,发给RPC-server
8)响应包在网络传输,发回给RPC-client
9)通过连接connection从RPC-server收取响应包packet2
10)下游收发线程,将报文放入“已接受队列”,通过连接池组件,将conneciont放回连接池
11)下游收发队列里,报文被取出,此时回调将要开始,不会阻塞工作线程
12)序列化组件,将packet2范序列化为Result对象
13)上下文管理器,将结果,回调,上下文取出
14)通过callback回调业务代码,返回Result结果,工作线程继续往下走
 
如果请求长时间不返回,处理流程是:
15)上下文管理器,请求长时间没有返回
16)超时管理器拿到超时的上下文
17)通过timeout_cb回调业务代码,工作线程继续往下走。
上下文管理器
为什么需要上下文管理器?
回答:由于请求包的发送,响应包的回调都是异步的,甚至不在同一个工作线程中完成,需要一个组件来记录一个请求的上下文,把请求-响应-回调等一些信息匹配起来。
 
如何将请求-响应-回调这些信息匹配起来?
这是一个很有意思的问题,通过一条连接往下游服务发送了a,b,c三个请求包,异步的收到了x,y,z三个响应包:

1)怎么知道哪个请求包与哪个响应包对应?

2)怎么知道哪个响应包与哪个回调函数对应?

回答:这是通过【请求id】来实现请求-响应-回调的串联的。





整个处理流程如上,通过请求id,上下文管理器来对应请求-响应-callback之间的映射关系:
1)生成请求id
2)生成请求上下文context,上下文中包含发送时间time,回调函数callback等信息
3)上下文管理器记录req-id与上下文context的映射关系,
4)将req-id打在请求包里发给RPC-server
5)RPC-server将req-id打在响应包里返回
6)由响应包中的req-id,通过上下文管理器找到原来的上下文context
7)从上下文context中拿到回调函数callback
8)callback将Result带回,推动业务的进一步执行。


超时管理器

超时管理器,用于实现请求回包超时回调处理。
每一个请求发送给下游RPC-server,会在上下文管理器中保存req-id与上下文的信息,上下文中保存了请求很多相关信息,例如req-id,回包回调,超时回调,发送时间等。
超时管理器启动timer对上下文管理器中的context进行扫描,看上下文中请求发送时间是否过长,如果过长,就不再等待回包,直接超时回调,推动业务流程继续往下走,并将上下文删除掉。
如果超时回调执行后,正常的回包又到达,通过req-id在上下文管理器里找不到上下文,就直接将请求丢弃(因为已经超时处理过了)。
转载地址:http://chuansong.me/n/750008246737
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RPC-client异步回调原理 的相关文章

  • java基础系列 -- 类的三大特性:封装、继承、多态

    java类的特性 类有三大特性 封装 继承 多态 封装 封装就是将类的某些属性隐藏起来 限制在类的外部对类内部成员进行访问 通过接口对外开放 但是在外部不能直接进行查找属性 只通过公共接口来访问类的成员数据 为什么要设置隐藏 隐藏数据是为了
  • jpa.hibernate.ddl-auto属性说明

    jpa hibernate ddl auto 的几个常用属性值 none 默认值 什么都不做 每次启动项目 不会对数据库进行任何验证和操作 create 每次运行项目 没有表会新建表 如果表内有数据会被清空 create drop 每次程序
  • nginx_http_proxy,upstream,stream模块简析

    一 ngx http proxy module模块 模块功能 为后端httpd服务做反向代理 并且与Httpd 之间使用http进行通信 1 proxy pass URL Context location if in location li
  • 如何求C语言字符串长度(strlen函数和sizeof关键字)

    如何求C语言字符串长度 strlen函数和sizeof关键字 在程序里 一般会用 strlen 函数或 sizeof 来获取一个字符串的长度 但这2种方法获取的字符串的长度其实是不一样 我们用如下函数进行测试 void test6 char
  • Java8新特性-Lambda表达式

    Lambda表达式 也可称为闭包 它是推动Java8发布的最重要的特性 Lambda允许把函数作为一个方法的参数 函数作为参数传递进入方法中去 使用lambda表达式可以把代码变得更加简洁紧凑 语法 lambda表达式的语法格式如下 par
  • Ciclop开源3D扫描仪软件---Horus源码分析之point_cloud_roi.py

    联系方式 QQ 2468851091 call 18163325140 Email 2468851091 qq com coding utf 8
  • C语言小游戏——井字棋(数组实现)

    学c也学了有一些时间了 今天用c语言做了一个小游戏 井字棋 相信大家也玩过 我们这个游戏的思路呢 是玩家和电脑对弈 谁先把三颗棋子连成一条线 谁就赢了 如下图所示 要想实现我们这个井字棋需要用到数组的知识 所以 老规矩我们先简单的把数组讲一
  • SCI审稿流程(转)

    1 收到邮件 编辑约审稿 同意就接受 会约定审稿期限 一般三个月 Dear Mr Cat Please be informed you have been registered by our editorial team as a user
  • scheduler学习率设置

    在炼丹的过程中 学习率的调整是必不可少的 下面给出scheduler模块的调学习率的方法 后面会慢慢补充 调整学习率 PyTorch官方文档 一 CyclicLR torch optim lr scheduler CyclicLR opti

随机推荐

  • php把二维数组变为一维,如何将PHP二维数组转换为一维数组

    如何将PHP二维数组转换为一维数组 发布时间 2020 07 22 11 12 05 来源 亿速云 阅读 137 作者 Leah 如何将PHP二维数组转换为一维数组 相信很多没有经验的人对此束手无策 为此本文总结了问题出现的原因和解决方法
  • 网络协议详解:TCP Part1

    目录 TCP的可靠性 TCP的机制 ack 编号机制 1 发送的数据编号 SN 2 确认的数据编号 ASN 3 编号规则 4 SN在发送TCP Segment 的 Header 中如何体现 5 ASN的填写规则 6 ISN TCP segm
  • 2.4.3 分区状态

    最后更新2021 07 17 No Active 分区处于非活动状态 在此状态 分区仅存在Profile的定义 可以有多个Profile定义 但都没有激活 而不占据任何系统资源 SMS服务模式状态 分区启动经过自检后将会根据Profile的
  • 香港爱情电影二十四经

    香港爱情电影二十四经之第一经 寻找 飞一般爱情小说 叶锦鸿1997 我们不是在寻找 我们只是在给邂逅一个机会 叶锦鸿的这部电影清新温暖 恬淡动人 一幅如流水般的爱情图画 三个青年相约一块寻找一个女孩 然后确定爱情的归属 谁都知道 这不是爱情
  • Vue路由基础部分,Vue路由基础知识

    Vue路由基础部分 Vue路由基础知识 1 介绍 2 基础 1 起步 2 动态路由匹配 3 嵌套路由 4 编程式的导航 5 命名路由 6 命名视图 7 重定向和别名 1 介绍 Vue Router 是 Vue js 官方的路由管理器 它由V
  • Chrome浏览器不能同步书签的解决方法

    问题现象 在Chrome浏览器登陆同步书签的时候 提示报错 解决方法 需要 使用Chrome访问助手 操作步骤 下载Chrome访问助手 https www ggfwzs com 下载后进行解压 然后依次点击如下操作 把刚才解压的 crx直
  • Microsoft Office 2007的安装

    哈喽 大家好 今天一起学习的是office2007的安装 有兴趣的小伙伴也可以来一起试试手 一 测试演示参数 演示操作系统 Windows 7 不建议win10及以上操作系统使用 系统类型 64位 演示版本 cn office ultima
  • opencv进阶学习笔记12:轮廓发现和对象测量

    基础版笔记目录 python3 opencv学习笔记汇总目录 适合基础入门学习 进阶版笔记目录链接 python opencv进阶版学习笔记目录 适合有一定基础 轮廓发现 1轮廓发现介绍 基础版讲解 opencv学习笔记20 图像轮廓 2轮
  • 控制符号的可见性

    在普通的C语言中 如果您希望将函数或者变量限制在当前文件中 需要对其使用static关键字 然而 在一个包含很多文件的共享库中 如果您希望某个符号可以被共享库内部的几个文件访问 而又不提供给外部 则对符号进行隐藏处理就会比较困难 大多数的连
  • 网络重连封装

    网络重连 部分情况会遇到业务接口失败 但我们又不希望让用户去退出应用重启 这时候我们可以在网络层设置一个重连机制 写这个的时候我想到了当时实现token无痛刷新时没有去解决的一个痛点 但我去刷新token的时候如果是获取令牌的接口报错那程序
  • python读取20万数据Excel文件+拆分数据

    python读取20万数据Excel文件 使用普通的pandas读取Excel 再结合xlrd读取 可能会读取的Excel数据会不全 最多只能读取到65535 行的数 如果读取超大excel数据时就读取不了 解决读取数据不全python代码
  • Unity——电脑游戏键盘与鼠标的输入

    代码如下 对键盘的输入需要逐帧读取 因此放入Update void Update 鼠标的点击 按下鼠标 0左键 1右键 2滚轮 if input GetMouseButtonDown 0 Debug log 按下了鼠标左键 持续按下鼠标 i
  • 计算机操作系统-运行机制、体系结构

    操作系统的运行机制 指令与代码的区别 例如C语言中的代码经过编译器翻译 得到机器语言指令 其中高级语言的代码翻译的结果可能会对应多条指令 简单来说 指令就是处理器CPU能识别 执行的最基本的命令 两种指令 有的指令执行起来不会对操作系统或者
  • 使用大华SDK遇到 “CANNOT RESOLVE COM.DAHUA.NETSDK:DAHUA-NETSDK-JNI:1.0.0”的解决方法

    因为maven官方仓库没有 所以需要自行手动安装 maven请添加环境变量 不添加的话就去maven的bin下面执行 然后在控制台执行如下指令 Dfile的内容是INetSDK jar在你自己本地计算机的位置 原文链接 解决 需要手工下载j
  • 【算法】归并排序

    include
  • 【Cocos2d-X开发学习笔记】开发工具之Tiled地图编辑器的使用

    Cocos2D X支持Tiled地图编辑器生成的地图数据文件 Tiled地图编辑器是一个以普遍使用为目标的地图编辑 器 它使用简单并且可以轻松地在不同的引擎中使用 目前最新版本使用Qt框架进行开发 之前也有Java版本 目的 就是可以使编辑
  • 柯美打印机服务器显示代码09,柯美数码复印机故障代码及维修模式【最新】.docx...

    美能达故障代码故障名称检测时机 柯美数码复印机维修代码 维修模式 C0000主马达故障 主马达开始运转1秒钟后的任何时候 主马达 M1 锁定信号会连续维持1秒钟的高电平 HIGH C0044ADF冷却风扇故障 仅在安装选购件AFR 19时
  • 企业级DevOps容器云平台流水线综合解决方案详解(一)

    一 Jenkins Pipeline 语法 1 Jenkins Pipeline 简介 Jenkins pipeline 流水线 是一套运行于 jenkins 上的工作流框架 将原本独立运行于单个或者 多个节点的任务连接起来 实现单个任务难
  • 功能测试基础之接口测试

    功能测试基础之接口测试 文章目录 功能测试基础之接口测试 定义 测试目的 接口测试分类 接口测试的方法 实例分析 定义 软件系统本身有不同模块组成 模块与模块之间存在着分工协作及信息交互 这种模块与模块之间的交互通道我们称之为软件系统的内部
  • RPC-client异步回调原理

    RPC client异步回调原理 见下面的设计图 所谓异步回调 在得到结果之前 不会处于阻塞状态 理论上任何时间都没有任何线程处于阻塞状态 因此异步回调的模型 理论上只需要很少的工作线程与服务连接就能够达到很高的吞吐量 上图中左边的框框 是