protobuf的困局

2023-10-13 07:18
文章标签 protobuf 困局

本文主要是介绍protobuf的困局,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


    很早以前就跟踪过protobuf,由于一直做业务系统,感觉protobuf在扩展性方面有问题,面对多变的业务逻辑,缺乏灵活性。目前,公司强行推行protobuf作为消息格式,除了吐槽之外,只能再次深入研究下protobuf的机制,希望能够找到一个突破点。


      目前,protobuf有几个重要特性,

     1、基于7bit格式的可变编码。默认状态下,对浮点数,负数没有编码优势,需要特别指定sint之类。

     2、允许指定每个字段的fid。这个特性,使得protobuf比C结构模式有更大的灵活性,可以不传字段也能正确解析。这个属性应该是后面才加上的,在我印象中,早期版本是没有的。

     3、基于proto文件的编解码器。这个模式有好处,可以跨语言使用,而且宿主语言直接可以以类的方式来访问。但由于是源码级兼容,并且编解码器是硬编码的,当proto发生变化时,所有引用该文件的程序都要重新编译。

     4、类型和fid是混合编码,至少减少一个字节用于存储类型。由于历史原因,只有3个bit用于表示类型,而且由于历史原因,有几个值被废弃,可供选择的范围更小。


     从传输内容来看,他的格式为FID + TYPE + BUFFER。

     1、由于FID是可变编码,具有灵活性。

      2、BUFFER是二进制内容,本身没有格式,所以无所谓局限性。但由于BUFFER是根据TYPE来解析的,所以他也会被TYPE所限制。

      3、TYPE由于3bit的限制,并且google内部大量已经存在的资源,TYPE被改变的可能性很小,并且也没有可以改变的空间。


      通过上面的分析,我们可以看到,在protobuf现在版本中,能扩的地方都扩,而不能扩的地方就剩下TYPE这个字段。这个就是我所要表述的protobuf困局的核心内容,而且是先天缺陷。


     为什么这么说呢?我们看到,protobuf在表述整型、浮点等基础类型方面,有够用的表达力【注意,不是足够的表达力】,但在表述list/嵌套/raw等复合类型时,只能靠proto来显式指定。也就是说,在这种情况下,如果没有或者缺乏最新proto文件,你将手足无措。


     如果有人说,这是protobuf的优势,我将深度鄙视。proto的解析器,一大段一大段代码,都在还这个债。

     protobuf解析器的速度,来源于他硬编码的解析程序,得到接近于直接内存转换的速度,这是个优势。但TYPE的缺失,将限制protobuf更广泛的引用,特别是在业务多变的系统中。


    有人会差异于为何没有提到掩码。由于掩码只在本地存在,所以无关紧要,即使出现问题,也容易被修正。还有字段描述和反射是他的优势,也不赘述了。


    另附上一个名人的吐槽:Protocol Buffers for C




这篇关于protobuf的困局的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201619

相关文章

C++常见异常汇总(三): fatal error: google/protobuf/port_def.inc

文章目录 1、fatal error : sw/redis++/redis.h2、fatal error: dwarf.h: No such file or directory3、fatal error: elfutils/libdw.h: No such file or directory4、fatal error: libunwind.h: No such file or directo

解决caffe 编译过程中protobuf版本冲突的问题

在编译caffe python3版本时一直会出现如下错误,(安装caffe python3具体方法可参考:https://blog.csdn.net/tingtie1438/article/details/82085199 ): 通过其错误信息可知是protobuf出了问题,现在网上教程一般都是默认安装的 libprotobuf-dev 和 protobuf-compiler,对于pytho

电商企业借助精益六西格玛培训提升资产周转率——从资本困局到效率跃升

随着市场日益饱和,电商企业的增长模式被迫从粗放式扩展向精细化运营转型。这个过程许多电商企业遭遇了资产周转率低下的瓶颈,资金流动性不足直接影响企业的扩展能力与市场竞争力。面对这一困境,越来越多的电商企业开始借助精益六西格玛这一强大的管理工具来优化运营流程,提升资产周转率,从而实现企业的高效可持续发展。 资产周转率是企业一定时期内的销售收入与平均资产总额的比率,反映了企业利用资产创造销售收入的效率。

Ubuntu安装boost,protobuf、moduo

一、Ubuntu安装muduo muduo库是基于boost开发的,确保先安装了boost(对boost版本有要求),还需要先安装protobuf,curl库 库版本boost1.70.0protobuf3.14.0curl7.74.0muduo2.0.2 1、Ubuntu安装boost # 更新资源列表sudo apt update# 安装依赖sudo apt install bu

在Javascript中使用protobuf与c++进行通信

环境:Win7_64旗舰版,VS2013 最近在研究Webkit,已经编译成功,接下来就是Javascript与c++如何传输数据,立刻就想到了protobuf,但是谷歌不支持Javascript,百度了很久,终于找到了 这篇文章:http://blog.csdn.net/xnn2s/article/details/8580917 一、首先下载protobuf,进行编译生成libprotob

python安装protobuf记录

需求背景 客户需要protobuf环境配置以及插件安装,我主要通过在pycharm里面配置参数,将问题解决!  导语 Python中的protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。它能够让您在不同的应用程序和语言之间轻松地共享数据,并且具有更好的性能和更小的数据大小。本文将指导您如何在Python中安装protobuf库

使用Protobuf来定义ROS消息格式[C++/Python]

一般我们自定义ROS消息使用ros_msgs来定义的,但是考虑到proto在传输消息优于ros自定义的消息格式,我们这里使用proto来定义ros消息 问题来源:之前看apollo的代码,就发现里面的消息使用proto来传输的,那我们我们自己用如何定义和使用呢,主要参考代码https://github.com/ApolloAuto/apollo-platform仓库里面的ros下面的pb_msgs

Visual Studio 2019 C# 自动生成Protobuf

Visual Studio VS2019 C#项目 自动生成Protobuf 1. 用NuGet安装Google.Protobuf,Google.Protobuf.Tools, Grpc,Grpc.Tools等包 2.在项目.csproj文件中增加 <ItemGroup><Compile Include="Properties\AssemblyInfo.cs" /><Compile Incl

SpringBoot 集成JprotoBuf实现protobuf类型的接口

文章目录 前言一、实现protobuf类型的接口1. 编写 Controller2. 模拟客户端发起请求3. Postman中发起请求 二、教程源码获取 前言 这篇文章我们讲解了protoBuf和JprotoBuf的区别,并实现SpringBoot集成JprotoBuf:SpringBoot JprotoBuf序列化与反序列化的实现 本文将基于以上文章内容继续讲解集成Jpr

Unity3d-protobuf简单应用

本文固定连接:http://blog.csdn.net/u013108312/article/details/52712119 using System.Text;using System.IO;using ProtoBuf;namespace Protobuf{class ProtobufHelper{/// <summary>/// 序列化成string/// </summary>