《消息队列高手课》传输协议:应用程序之间对话的语言

2023-11-11

*传输协议就是应用程序之间对话的语言。**设计传输协议,并没有太多规范和要求,只要是通信双方的应用程序都能正确处理这个协议,并且没有歧义就好了。

这节课,我们就来说一下设计高性能传输协议的一些方法和技巧。

如何“断句”?

既然传输协议也是一种语言,那么在应用程序之间“通话”的过程中,与我们人类用自然语言沟通有很多相似之处,但是需要处理的问题却又不同。

现代语言,无论是汉语还是英语,都是通过标点符号来分隔句子的,这个叫“断句”。古代汉语是没有标点符号的,断句全靠上下文,但这种断句方式有的时候会出现歧义,比如很著名的那个段子“下雨天留客天天留我不留”,不同的断句方式,意思完全不一样。

我们在传输数据的的时候,首先要解决的就是断句问题。对于传输层来说,收到的数据是什么样的?就是一段一段的字节,但是,因为网络的不确定性,你收到的分段并不一定是我们发出去的分段。比如我们发送的数据是这样的:

下雨天 留客天 天留 我不留

这样断句,意思就是,作为主人我不想让你在我这儿住。

经过网络传输,可能就变成这样了:

下雨天 留客天 天留我不 留

意思完全变了,客人想赖在这儿不走了。

所以,靠时间停顿来断句是不靠谱的。

你可能会想到,那我们在协议中也加上“标点符号”不就行了?而且,我们并不需要像自然语言中那么多种标点符号,只需要定义一个分隔符就可以了。

这个办法是可行的,也有很多传输协议采用这种方法,比如 HTTP1 协议,它的分隔符是换行(\r\n)。但是,这个办法有一个问题比较难处理,在自然语言中,标点符号是专用的,它没有别的含义,和文字是有天然区分的。

在数据传输的过程中,无论你定义什么字符作为分隔符,理论上,它都有可能会在传输的数据中出现。为了区分“数据内的分隔符”和真正的分隔符,你必须得在发送数据阶段,加上分隔符之前,把数据内的分隔符做转义,收到数据之后再转义回来。这是个比较麻烦的过程,还要损失一些性能。

更加实用的方法是,我们给每句话前面加一个表示这句话长度的数字,收到数据的时候,我们按照长度来读取就可以了。比如:

03 下雨天 03 留客天 02 天留 03 我不留

这里面我们固定使用 2 位数字来存放长度,每句话最长可以支持到 99 个字。接收后的处理就比较简单了,我们先读取 2 位数字 03,知道接下来的 3 个字是第一句话,那我们接下来就等着这 3 个字都收到了,就可以作为第一句话来处理了,接下来再按照这个方法来读第二句话、第三句话。

这种预置长度的方法就很好解决了断句的问题,并且它实现起来要比分隔符的方法简单很多,性能也更好,是目前普遍采用的一种分隔数据的方法。

掌握了断句的方法之后,我们再来看一下实现高性能协议还需要解决什么问题。

用双工收发协议提升吞吐量

人类之间通过语言来交流时,基本上是处于一种单工通信的状态,也就是我说你听,然后再你说我听这样。如果俩人同时说,那就不是交流了,那是两个外国人在吵架。所谓的单工通信就是,任何一个时刻,数据只能单向传输,一个人说的时候,另外一个人只能听。

HTTP1 协议,就是这样一种单工协议,客户端与服务端建立一个连接后,客户端发送一个请求,直到服务端返回响应或者请求超时,这段时间内,这个连接通道上是不能再发送其他请求的。这种单工通信的效率是比较低的,很多浏览器和 App 为了解决这个问题,只能同时在服务端和客户端之间创建多个连接,这也是没有办法的办法。

单工通信时,一句对一句,请求和响应是按照顺序依次收发,有一个天然的对应关系。比如说,胡同口张大爷和李大爷俩大爷碰上了:

这个图里面,实线是请求,虚线是响应,一问一答,这是单工协议。

我们知道,TCP 连接它是一个全双工的通道,你可以同时进行数据的双向收发,互相是不会受到任何影响的。要提高吞吐量,应用层的协议也必须支持双工通信。

如果说俩大爷有边听边说的本事,换成双工协议后,是这样的:

这时候就出现一个问题,即使俩大爷有这个边听边说的本事,问题和答案可能已经对不上了。在多线程并发的环境下,顺序也没有办法保证,这个对话就有可能变成这样:

 

在实际上设计协议的时候,我们一般不关心顺序,只要需要确保请求和响应能够正确对应上就可以了。

这个问题我们可以这样解决:发送请求的时候,给每个请求加一个序号,这个序号在本次会话内保证唯一,然后在响应中带上请求的序号,这样就可以把请求和响应对应上了。

加上序号后,俩大爷的就可以实现双工通信了:

张大爷和李大爷可以对自己发出去的请求来编号,回复对方响应的时候,带上对方请求的编号就可以了。这样就解决了双工通信的问题。

小结

这节课我们主要讲了传输协议,在设计传输协议的时候,只要双方应用程序能够识别传输协议,互相交流就可以了,并没有什么一定要遵循的规范。

在设计传输协议的时候,需要解决如何断句的问题,我们给大家提供了“分隔符”和“前置长度”两种断句的方法,你可以选择使用。

另外,我给大家介绍的这种“使用 ID 来标识请求与响应对应关系”的方法,是一种比较通用的实现双工通信的方法,可以有效提升数据传输的吞吐量。

解决了断句问题,实现了双工通信,配合专用的序列化方法,你就可以实现一套高性能的网络通信协议,实现高性能的进程间通信。很多的消息队列、RPC 框架都是用这种方式来实现它们自己的私有应用层传输协议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《消息队列高手课》传输协议:应用程序之间对话的语言 的相关文章

  • 罗马数字转整数(Java实现)

    罗马数字转整数 Java实现 罗马数字包含以下七种字符 I V X L C D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 罗马数字 2 写做 II 即为两个并列的 1 12 写做 X
  • 配置常用yum源(国内yum源)

    记录 356 场景 在CentOS 7 9操作系统上 使用国内开源镜像站配置常用yum源 满足使用yum命令安装各类软件需求 包括CentOS基础包 epel包 scl包 k8s等 版本 操作系统 CentOS 7 9 开源镜像站 阿里云开
  • Mybatis学习笔记2:CRUD操作及MybatisConfig.xml配置解析

    一 CRUD操作 1 select select语句有很多属性可以详细配置每一条sql语句 sql的返回值类型 传入sql语句的参数类型 命名空间唯一标识符 接口中的方法名与映射文件中的sql语句id要对应 id parameterType
  • Eclipse 乱码 解决方案总结(UTF8 -- GBK)

    UTF8 gt GBK GBK gt UTF8 eclipse的中文乱码问题 一般不外乎是由操作系统平台编码的不一致导致 如Linux中默认的中文字体编码问UTF8 而Windows默认的中文编码为GBK 因此将Linux和Windows下
  • 图像均值滤波简介及实现

    一 均值滤波简介和原理 均值滤波 是图像处理中常用的手段 从频率域观点来看均值滤波是一种低通滤波器 高频信号将会去掉 均值滤波可以帮助消除图像尖锐噪声 实现图像平滑 模糊等功能 理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像

随机推荐

  • ubuntu-多网卡聚合-bond技术教程-配置interfaces

    目录 1 Bond的工作模式 2 配置步骤 3 删除bond 4 总结 5 发现的问题 注意 以下配置步骤 只测试了ubuntu20 04有效 其他版本没试过 经查阅资料 建议ubuntu20 04以前的版本使用本文章方法 含ubuntu2
  • IntelliJ IDEA常用插件及其安装

    插件列表 环境 MacOS平台 IDEA版本 2019 3 类别 插件名称 插件描述 备注 美化 Material Theme UI不免费了 建议用Solarized Themes 一款IDEA主题插件 个人用Light Owl或Solar
  • 用jackson序列化No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer

    jackson序列化 用jackson将对象序列化字符串的时候出现了下面No serializer found for class org hibernate proxy pojo javassist JavassistLazyInitia
  • 【FFmpeg实战】FFplay音频滤镜分析

    原文地址 https juejin cn post 7153334309208719368 音频流的 滤镜是通过 configure audio filters 函数来创建的 因为 ffplay 为了代码的通用性 即便命令行参数不使用滤镜
  • 因计算机中丢失msvcr120.dll,msvcr120.dll丢失怎样修复 附解决方法

    运程程序时如果提示这个 那么是因为你的电脑里没有vc 运行库导致的 不要从网上一个一个下载msvcr120 dll这样的文件放到系统目录里 因为有很多文件 真正的解决方法是下载并安装微软VC 2013版运行库 就可以修复这个问题 直接百度搜
  • 算法记录题四

    1 什么是集成学习算法 2 集成学习主要有哪几种框架 并简述他们的工作过程 3 Boosting算法有哪两类 他们之间的区别是什么 4 什么是偏差和方差 5 如何从减少方差和偏差的角度解释Boosting和Bagging的康 6 随机森林的
  • 【MySQL】SQL之CASE WHEN用法详解

    目录 一 简单CASE WHEN函数 二 CASE WHEN条件表达式函数 三 常用场景 场景1 不同状态展示为不同的值 场景2 统计不同状态下的值 场景3 配合聚合函数做统计 场景4 CASE WHEN中使用子查询 场景5 经典行转列 结
  • 51 openEuler搭建PostgreSQL数据库服务器-安装、运行和卸载

    文章目录 51 openEuler搭建PostgreSQL数据库服务器 安装 运行和卸载 51 1 安装 51 2 运行 51 2 1 初始化数据库 51 2 2 启动数据库 51 2 3 登录数据库 51 2 4 配置数据库账号密码 51
  • js实现雪花飘落效果

    js实现雪花飘落效果 我们可以先看看效果 点这里 雪花 其实总的代码都不到 100 行 代码很少 因此 css 样式 和 js 代码我都放在一个 HTML 文件里面了 我们先看看主体的 HTML 代码 div div html 的代码就只有
  • 搭建目标检测模型之Domain Adaptive Faster R-CNN for Object Detection in the Wild

    搭建环境 方法1 直接搭建环境 报错及解决方法 准备数据集 官方数据集 训练模型 测试模型 训练结果 有问题 搭建环境 方法1 直接搭建环境 克隆项目Domain Adaptive Faster RCNN PyTorch git clone
  • 华为od机试题8 真题

    华为od机试题 真题 10 输出最多类型的个数 11 树根节点到最小的叶子节点的路径 12 货车最大载货量 13 太阳能板最大面积 14 单词接龙 17 输出连续出现次数第k多的字母的次数 18 喊7 19 删除出现次数最少的字符 以下题目
  • actuator--基础--08--application.yml配置

    actuator 基础 08 application yml配置 management endpoints 暴露 EndPoint 以供访问 有jmx和web两种方式 exclude 的优先级高于 include jmx exposure
  • windows7 64位机上,libjpeg-turbo的安装和使用

    libjpeg turbo是对libjpeg的扩展 支持SIMD指令 如X86架构的MMX SSE SSE2 3DNOW ARM架构的NEON 在对jpeg进行编码和解码的过程中能提高速度 MMX 多媒体扩展的缩写 第六代CPU芯片重要特点
  • 【Modbus】 RTU CRC校验码计算方法

    Modbus是美国Modicon公司 即现在的Schneider Electric公司 于1979年开发的一种通信协议 其目的是采用一根双绞线实现多个设备之间的通信 Modbus 协议采用问答式的通信方式 具有简单 硬件便宜 通用性强 使用
  • 2023_华为OD机试真题_Java_001_AI处理器组合

    AI处理器组合 题目描述 某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2 3 4 5 6 7 编号0 3的处理器处于同一个链路中 编号4 7的处理器处于另外一个链路中 不通链路中的处理器不能通信 如下
  • pip 删除安装包_最新版pip用法一览

    pip 是 Python 包管理工具 该工具提供了对Python 包的查找 下载 安装 卸载的功能 熟练使用此工具 也是python的基本功 https pypi org目前最新版本为20 2 2 以下就以此版本来演示其使用 下面演示 是在
  • pytorch学习(六)---搭建简单的神经网络以及sequential的使用

    本篇自学笔记来自于b站 PyTorch深度学习快速入门教程 绝对通俗易懂 小土堆 Up主讲的非常通俗易懂 文章下方有视频连接 如有需要可移步up主讲解视频 如有侵权 实非故意 深表歉意 请与我联系 删除相关内容 本节以CIFAR10的模型结
  • emwin多语言实现的两种方式

    MCU开发中经常会涉及到多语言的制作和支持 本文将介绍两种制作字库的方法 字库的实现主要包含两部分 一是 字库 一是要显示的字符串 将这两个东西准备好 就可以实现了 第一种方法 详细的可以直接参考这篇博客 可 EMWIN 多国语言实现方法
  • 【信号采集】基于FPGA的高速信号采集系统

    1 高速采集系统实现的功能 FPGA内部功能模块组成 2 高速ADC接口的FPGA实现 3 数字下变频 DDC 的FPGA实现 4 三倍抽取功能的FPGA实现 5 Aurora接口的FPGA实现 高速采集系统的功能和组成 1 实现功能 对中
  • 《消息队列高手课》传输协议:应用程序之间对话的语言

    传输协议就是应用程序之间对话的语言 设计传输协议 并没有太多规范和要求 只要是通信双方的应用程序都能正确处理这个协议 并且没有歧义就好了 这节课 我们就来说一下设计高性能传输协议的一些方法和技巧 如何 断句 既然传输协议也是一种语言 那么在