#### grpc比http性能高的原因 ####

grpc比http性能高的原因

二进制消息格式:gRPC使用Protobuf(一种有效的二进制消息格式)进行序列化,这种格式在服务器和客户端上的序列化速度非常快,且序列化后的消息体积小,适合带宽有限的场景。

HTTP/2协议:gRPC是为HTTP/2设计的,HTTP/2协议在发送和接收方面都是紧凑且高效的,支持多路复用,即在单个TCP连接上可以复用多个HTTP/2调用,消除了应用程序层的队头阻塞问题。

流控制和双向通信:gRPC支持双向流控制机制,允许客户端和服务器之间进行实时的双向通信,这对于需要实时数据交互的应用非常有利。

为什么protobuf比较高效

概括:

即:序列化后数据体积小(压缩率高)、序列化和反序列化速度快。

与XML、JSON这类文本协议相比,ProtoBuf通过T-L-V(TAG-LENGTH-VALUE)方式编码,不需要", {, }, :等分隔符来结构化信息。同时在编码层面使用varint压缩,所以描述同样的信息,protobuf序列化后的体积要小很多,在网络中传输消耗的网络流量更少。

详细:
(1)压缩率高

protobuf基于接口描述语言IDL(Interface Description Language)实现消息结构的定义,传输数据的两端都需要定义该消息结构,并保存在.proto文件中,这样就不需要在消息数据中定义结构信息,自然就把空间压榨到极限了。例如:

        package my;
        message helloworld
                {
                            required int32 id = 1;
                            required string str = 2;
                            optional int32 wow = 3;
                }

除此之外,每个消息项前面有对应的tag,才能解析对应的数据类型,类似于计算机网络中传输IP数据包也需要分隔符来标识一样。对于protobuf,tag的大小是一个字节,即八位,tag的计算方式: tag = (field_number << 3) | wire_type,其中,上面定义的1,2,3可以类比json中的key。field_number是.proto文件用于定义某个字段,比如对于上述消息结构,id是1,str是2,wow是3,wire_type是google官方定义的,它是消息结构类型的一种再次分类,每个wire_type都可以对应多种数据类型,每种数据类型都有对应的wire_type:可以观察到,protobuf支持的wire_type 范围是0~5,对应二进制也就是000~101,正好是三位,那么按照tag计算公式,field_number左移三位之后,再或上wire_type就组成了tag。这样就总共是六位,放在一个字节中,表示tag,就可以标识该字段的结构信息。因此在判断wire_type类型的时候,只需要取后三位。

(2)解析快

(a)Varint编码:

在说varint之前,我们回顾一下,传输int需要四字节,但如果这个数用不到四字节,那么会导致浪费,例如对于整数267,二进制表示是00000000 00000000 00000001 00001011,前两个字节就是浪费的。

varint是一种特殊的编码,例如下图是两个字节(这两个字节其实对于varint编码来说,表示267,why?我们后面就见分晓):
第一个字节最高是1,表示下一个字节也是其想表述的数据的组成部分。反之,0则表示下一个字节与当前字节没有关系。

这样的话,其实上面16位里,只有14位是有实际数据意义的,从左到右先放高位,那么就是0000010 0001011,连一起就是00000100001011,正好就是前面我们的例子267的二进制表示

那么,varint编码有什么问题吗?

如果想表示-1,二进制是11111111 11111111 11111111 11111111 ,用varint编码效率很低。

(b)Zigzag编码:

Zigzag编码规则如下:

如果数据是负数,那么套用2*|x|-1来编码表示
如果数据是正数,那么套用2*|x| 来编码表示
那么对于-1,就编成1,再二进制表示,就是00000001

上面的编码都是基于数字编码,那么如果传输字符串,就显得不太方便。

(c)TLV(Tag-Length-Value):

这不是一种编码格式,而是一种传输规则,对于传输字符串,Tag还是起到分隔符的作用,Length表示字符串的长度,Value表示字符的具体值,不进行编码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/751591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Py之dashscope:dashscope的简介、安装和使用方法、案例应用之详细攻略

Py之dashscope&#xff1a;dashscope的简介、安装和使用方法、案例应用之详细攻略 目录 dashscope的简介 1、产品的主要特点和优势包括&#xff1a; dashscope的安装和使用方法 1、安装 2、使用方法 dashscope的案例应用 1、通义千问-Max&#xff1a;通义千问2.5系列 2…

Ubuntu Nvidia GPU驱动安装和故障排除

去官网 菜单列表下载&#xff0c;或者直接下载驱动 wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run 安装驱动 /data/install/NVIDIA-Linux-x86_64-550.54.14.run 执行命令&#xff0c;显示GPU情况 出错处理&…

lodash 中的 isObject 以及 isPlanObject

所以说 用isObject 检测返回true的类型 远不止Object 如果要判断一个值是否为普通对象&#xff0c;可以使用isPlainObject

技术速递|Visual Studio Code 的 .NET MAUI 扩展现已正式发布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常高兴地宣布 .NET MAUI VS Code 扩展插件结束了预览阶段&#xff0c;并将包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 扩展插件&…

密码学及其应用 —— 对称加密技术

1. 对称加密、流加密和块加密 1.1 对称加密 对称加密&#xff08;也称为密钥加密&#xff09;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种加密方法基于二进制层面的操作&#xff0c;如XOR&#xff08;异或&#xff09;、SHIFT&#xff08;位移&#xff09;…

浅谈linux(1)

文章目录 一、linux1.1、使用终端xshell登陆到云服务器上1.2、linux一些常用命令1.2.1、一些快捷键1.2.2、关于目录的操作1.2.3、关于文件的命令1.2.4、关于目录的命令1.2.5、vim 针对文件进行编辑 一、linux linux 操作系统&#xff0c;我使用的是发行版&#xff0c;Centos7。…

【LeetCode】七、树、堆、图

文章目录 1、树结构2、二叉树3、二叉树的遍历4、堆结构&#xff08;Heap&#xff09;5、堆化6、图 1、树结构 节点、根节点、叶子节点&#xff1a; 高度、深度、层三者的示意图&#xff1a; 2、二叉树 相比其他树&#xff0c;二叉树即每个节点最多两个孩子&#xff08;两个分…

ActiveMQ camel

游览器输入地址: http://127.0.0.1:8161/admin/ 访问activemq管理台 账号和密码默认为: admin/admin# yml配置的密码也是如下的密码 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: adminComponent public class ActiveMqReceiveRouter extends Rout…

手写SpringMVC之调度器DispatcherServlet

DispatcherServlet&#xff1a;分发、调度 根据上一节&#xff0c;已经实现了将controller的方法添加到容器中&#xff0c;而DispatcherServlet的作用就是接收来自客户端的请求&#xff0c;然后通过URI的组合&#xff0c;来找到对应的RequestMapping注解的方法&#xff0c;调用…

C语言 | Leetcode C语言题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n & (n - 1);}return n; }

vue3 【提效】自动导入框架方法 unplugin-auto-import 实用教程

是否还在为每次都需要导入框架方法而烦恼呢&#xff1f; // 每次都需手动导入框架方法 import { ref } from vuelet num ref(0)用 unplugin-auto-import 来帮你吧&#xff0c;以后只需这样写就行啦&#xff01; let num ref(0)官方示例如下图 使用流程 1. 安装 unplugin-au…

网信办算法备案详细解读——中国人工智能监管新规

中国出台新规旨在防范人工智能的相关风险&#xff0c;且规定了从事人工智能相关业务的实体的合规义务。 要点&#xff1a; • 中华人民共和国&#xff08;中国&#xff09; 通过推出并实施如下一系列法规&#xff0c;在人工智能监管方面领先于其他司法管辖 区&#xff1a…

ONLYOFFICE 8.1编辑器桌面应用程序来袭——在线全面测评

目录 ✈下载✈ &#x1f440;界面&#x1f440; &#x1f44a;功能&#x1f44a; &#x1f9e0;幻灯片版式的重大改进&#x1f9e0; ✂无缝切换文档编辑、审阅和查看模式✂ &#x1f3b5;在演示文稿中播放视频和音频文件&#x1f3b5; &#x1f917;版本 8.1&#xff1a…

Web渗透:文件包含漏洞

Ⅱ.远程文件包含 远程文件包含漏洞&#xff08;Remote File Inclusion, RFI&#xff09;是一种Web应用程序漏洞&#xff0c;允许攻击者通过URL从远程服务器包含并执行文件&#xff1b;RFI漏洞通常出现在动态包含文件的功能中&#xff0c;且用户输入未经适当验证和过滤。接着我…

亚马逊AI技术风波:人工智能“洗白”现象引发质疑

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

并发 多线程

目录 thread thread 类总览 构造函数 join joinable ​编辑 detach swap yield swap 成员函数的调用 namespace::this_thread 线程同步--锁 互斥锁mutex 递归锁recursive_mutex 定时锁 Lock 锁辅助类 lock_guard​编辑 unique_lock std::lock 解决死锁问题 消息…

提升Unity WebGL游戏启动速度

一、查看启动耗时 通过修改unity-namespace.js中hideTimeLogModal为false&#xff0c;显示timelog开发者可以看到小游戏目前的启动首屏时长&#xff1a; 将其设置为false后&#xff0c;启动小程序后就会显示启动耗时 要知道各个阶段的含义&#xff0c;我们必要理解启动流程。 …

vue3用自定义指令实现按钮权限

1&#xff0c;编写permission.ts文件 在src/utils/permission.ts import type { Directive } from "vue"; export const permission:Directive{// 在绑定元素的父组件被挂载后调用mounted(el,binding){// el&#xff1a;指令所绑定的元素&#xff0c;可以用来直接操…

小程序消息定时任务(定时触发器)发送总结

文章目录 小程序消息定时任务&#xff08;定时触发器&#xff09;发送总结1.开发思路2.实现办法3.查看定时触发器是否正常运作4.总结 小程序消息定时任务&#xff08;定时触发器&#xff09;发送总结 1.开发思路 在使用小程序的时候总是会遇到消息任务发送的情况&#xff0c;…

BERT论文略读

《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》 &#xff08;https://arxiv.org/abs/1810.04805&#xff09; 摘要&#xff1a;前人优秀工作仅用了单向信息且不能很好的应用到各类下游任务&#xff0c;本文提出一种基于Transformer的双…