iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >RPC消息协议设计原理是什么
  • 598
分享到

RPC消息协议设计原理是什么

2023-06-02 20:06:13 598人浏览 薄情痞子
摘要

这篇文章主要介绍了rpc消息协议设计原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇RPC消息协议设计原理是什么文章都会有所收获,下面我们一起来看看吧。消息边界RPC 需要在一条 tcp 链接上进行多次

这篇文章主要介绍了rpc消息协议设计原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇RPC消息协议设计原理是什么文章都会有所收获,下面我们一起来看看吧。

消息边界

RPC 需要在一条 tcp 链接上进行多次消息传递。在连续的两条消息之间必须有明确的分割规则,以便接收端可以将消息分割开来,这里的接收端可以是 RPC 服务器接收请求,也可以是 RPC 客户端接收响应。

基于 TCP 链接之上的单条消息如果过大,就会被网络协议栈拆分为多个数据包进行传送。如果消息过小,网络协议栈可能会将多个消息组合成一个数据包进行发送。对于接收端来说它看到的只是一串串的字节数组,如果没有明确的消息边界规则,接收端是无从知道这一串字节数组究竟是包含多条消息还是只是某条消息的一部分。

比较常用的两种分割方式是特殊分割符法和长度前缀法。

RPC消息协议设计原理是什么

消息发送端在每条消息的末尾追加一个特殊的分割符,并且保证消息中间的数据不能包含特殊分割符。比如最为常见的分割符是 。当接收端遍历字节数组时发现了 ,就立即可以断定 之前的字节数组是一条完整的消息,可以传递到上层逻辑继续进行处理。HttpRedis 协议就大量使用了 分割符。此种消息一般要求消息体的内容是文本消息。

RPC消息协议设计原理是什么

消息发送端在每条消息的开头增加一个 4 字节长度的整数值,标记消息体的长度。这样消息接受者首先读取到长度信息,然后再读取相应长度的字节数组就可以将一个完整的消息分离出来。此种消息比较常用于二进制消息。

基于特殊分割符法的优点在于消息的可读性比较强,可以直接看到消息的文本内容,缺点是不适合传递二进制消息,因为二进制的字节数组里面很容易就冒出连续的两个字节内容正好就是 分割符的 ascii 值。如果需要传递的话,一般是对二进制进行 base64 编码转变成普通文本消息再进行传送。

基于长度前缀法的优点和缺点同特殊分割符法正好是相反的。长度前缀法因为适用于二进制协议,所以可读性很差。但是对传递的内容本身没有特殊限制,文本和内容皆可以传输,不需要进行特殊处理。HTTP 协议的 Content-Length 头信息用来标记消息体的长度,这个也可以看成是长度前缀法的一种应用。

RPC消息协议设计原理是什么

HTTP 协议是一种基于特殊分割符和长度前缀法的混合型协议。比如 HTTP 的消息头采用的是纯文本外加 分割符,而消息体则是通过消息头中的 Content-Type 的值来决定长度。HTTP 协议虽然被称之为文本传输协议,但是也可以在消息体中传输二进制数据数据的,例如音视频图像,所以 HTTP 协议被称之为「超文本」传输协议。

消息的结构

每条消息都有它包含的语义结构信息,有些消息协议的结构信息是显式的,还有些是隐式的。比如 JSON 消息,它的结构就可以直接通过它的内容体现出来,所以它是一种显式结构的消息协议。

RPC消息协议设计原理是什么

json 这种直观的消息协议的可读性非常棒,但是它的缺点也很明显,有太多的冗余信息。比如每个字符串都使用双引号来界定边界,key/value 之间必须有冒号分割,对象之间必须使用大括号分割等等。这些还只是冗余的小头,最大的冗余还在于连续的多条 json 消息即使结构完全一样,仅仅只是 value 的值不一样,也需要发送同样的 key 字符串信息。

消息的结构在同一条消息通道上是可以复用的,比如在建立链接的开始 RPC 客户端和服务器之间先交流协商一下消息的结构,后续发送消息时只需要发送一系列消息的 value 值,接收端会自动将 value 值和相应位置的 key 关联起来,形成一个完成的结构消息。在 hadoop 系统中广泛使用的 avro 消息协议就是通过这种方式实现的,在 RPC 链接建立之处就开始交流消息的结构,后续消息的传递就可以节省很多流量。

消息的隐式结构一般是指那些结构信息由代码来约定的消息协议,在 RPC 交互的消息数据中只是纯粹的二进制数据,由代码来确定相应位置的二进制是属于哪个字段。比如下面的这段代码

RPC消息协议设计原理是什么

如果纯粹看消息内容是无法知道节点消息内容中的哪些字节的含义,它的消息结构是通过代码的结构顺序来确定的。这种隐式的消息的优点就在于节省传输流量,它完全不需要传输结构信息。

消息压缩

如果消息的内容太大,就要考虑对消息进行压缩处理,这可以减轻网络带宽压力。但是这同时也会加重 CPU 的负担,因为压缩算法是 CPU 计算密集型操作,会导致操作系统的负载加重。所以,最终是否进行消息压缩,一定要根据业务情况加以权衡。

如果确定压缩,那么在选择压缩算法包时,务必挑选那些底层用 C 语言实现的算法库,因为 python 的字节码执行起来太慢了。比较流行的消息压缩算法有 Google 的 snappy 算法,它的运行性能非常好,压缩比例虽然不是最优的,但是离最优的差距已经不是很大。阿里的 SOFA RPC 就使用了 snappy 作为协议层压缩算法。

流量的极致优化

开源的流行 RPC 消息协议往往对消息流量优化到了极致,它们通过这种方式来打动用户,吸引用户来使用它们。比如对于一个整形数字,一般使用 4 个字节来表示一个整数值。

但是经过研究发现,消息传递中大部分使用的整数值都是很小的非负整数,如果全部使用 4 个字节来表示一个整数会很浪费。所以就发明了一个类型叫变长整数varint。数值非常小时,只需要使用一个字节来存储,数值稍微大一点可以使用 2 个字节,再大一点就是 3 个字节,它还可以超过 4 个字节用来表达长整形数字。

其原理也很简单,就是保留每个字节的最高位的 bit 来标识是否后面还有字节,1 表示还有字节需要继续读,0 表示到读到当前字节就结束。

RPC消息协议设计原理是什么

那如果是负数该怎么办呢?-1 的 16 进制数是 0xFFFFFFFF,如果要按照这个编码那岂不是要 6 个字节才能存的下。-1 也是非常常见的整数啊。

于是 zigzag 编码来了,专门用来解决负数问题。zigzag 编码将整数范围一一映射到自然数范围,然后再进行 varint 编码。

RPC消息协议设计原理是什么

zigzag 将负数编码成正奇数,正数编码成偶数。解码的时候遇到偶数直接除 2 就是原值,遇到奇数就加 1 除 2 再取负就是原值。

关于“RPC消息协议设计原理是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“RPC消息协议设计原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: RPC消息协议设计原理是什么

本文链接: https://www.lsjlt.com/news/231306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • RPC消息协议设计原理是什么
    这篇文章主要介绍了RPC消息协议设计原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇RPC消息协议设计原理是什么文章都会有所收获,下面我们一起来看看吧。消息边界RPC 需要在一条 TCP 链接上进行多次...
    99+
    2023-06-02
  • HTTP协议的工作原理是什么
    这篇文章主要介绍“HTTP协议的工作原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“HTTP协议的工作原理是什么”文章能帮助大家解决问题。HTTP协议(HyperText Transfer ...
    99+
    2023-06-04
  • 如何理解FIX协议的原理、消息格式及配置开发
    本篇文章给大家分享的是有关如何理解FIX协议的原理、消息格式及配置开发,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、定义FIX协议是由国际FIX协会组织提供的一个开放式协议...
    99+
    2023-06-05
  • Golang原生rpc的原理是什么
    这篇文章主要讲解了“Golang原生rpc的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang原生rpc的原理是什么”吧!创建rpc接口,需要几个条件方法的类型是可输出的方...
    99+
    2023-06-29
  • HTML5中WebSocket协议的实现原理是什么
    这篇文章将为大家详细讲解有关HTML5中WebSocket协议的实现原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。WebSocket协议的目的是为了工作于现有的网络基础设施。作为这...
    99+
    2023-06-09
  • SOCKS代理协议是什么
    本篇内容主要讲解“SOCKS代理协议是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SOCKS代理协议是什么”吧!  SOCKS代表Socket Secure,是一种网络协议,它通过代表客户...
    99+
    2023-06-21
  • rabbitmq消息持久化的原理是什么
    RabbitMQ的消息持久化是指在消息发送过程中,将消息存储在磁盘上,以防止在RabbitMQ服务器发生故障或重启时丢失消息。消息持...
    99+
    2023-10-09
    rabbitmq
  • HTTP协议的特点和工作原理是什么
    本篇内容介绍了“HTTP协议的特点和工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、HTTP简介1、简介HTTP超文本传输协...
    99+
    2023-07-02
  • Remix设计原理是什么
    本文小编为大家详细介绍“Remix设计原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Remix设计原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Remix 中的丰富经验Remix 版本: v...
    99+
    2023-07-05
  • Go的内置RPC原理是什么
    这篇文章主要介绍“Go的内置RPC原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go的内置RPC原理是什么”文章能帮助大家解决问题。从一个 Demo 入手为了快速进入状态,我们先搞一个 D...
    99+
    2023-07-05
  • php实现消息推送的原理是什么
    这篇文章主要讲解了“php实现消息推送的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php实现消息推送的原理是什么”吧!一、PHP实现消息推送的基础在介绍PHP实现消息推送的原理...
    99+
    2023-07-06
  • html5的设计原理是什么
    本篇内容主要讲解“html5的设计原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5的设计原理是什么”吧!实际上,确实有人会谈到规范的内容。史蒂...
    99+
    2024-04-02
  • Linux Tcp内核协议栈Packet Drill基本原理是什么
    本篇内容介绍了“Linux Tcp内核协议栈Packet Drill基本原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux ...
    99+
    2023-06-15
  • Linux时间同步协议NTP的工作原理是什么
    NTP(Network Time Protocol)是一种用于同步网络中计算机的时间的协议。其工作原理如下: NTP服务器:网络...
    99+
    2024-04-02
  • HTTP协议在Java教程中的实现原理是什么?
    HTTP协议是现今最流行的网络协议之一,Java语言也提供了多种方式来实现HTTP协议。在本文中,我们将深入探讨HTTP协议在Java教程中的实现原理。 HTTP协议简介 在探讨HTTP协议在Java中的实现原理之前,我们需要先了解HTT...
    99+
    2023-06-17
    教程 http 自然语言处理
  • Container应用设计原理是什么
    这篇文章主要介绍“Container应用设计原理是什么”,在日常操作中,相信很多人在Container应用设计原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Container应用设计原理是什么”的疑...
    99+
    2023-06-04
  • rainbond的架构设计原理是什么
    这篇“rainbond的架构设计原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“rainbond的架构设计原理是什么...
    99+
    2023-06-29
  • 微服务架构设计RocketMQ进阶事务消息原理详解
    目录前言RocketMQ事务流程概要RocketMQ事务流程关键实现基础配置引入组件添加配置发送半消息执行本地事务与回查消费消息测试总结前言 分布式消息选型的时候是否支持事务消息是一...
    99+
    2024-04-02
  • Java Socket线程的设计原理是什么
    这篇文章主要讲解了“Java Socket线程的设计原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Socket线程的设计原理是什么”吧!Java Socket线程我们经常...
    99+
    2023-06-17
  • SAP CRM Relationship API设计原理是什么呢
    SAP CRM Relationship API设计原理是什么呢,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。与settype不同,关系的元数据表中并没有维护专用的读取功能模块...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作