protobuf json

news/2025/1/12 18:20:24/文章来源:https://www.cnblogs.com/papering/p/18520987

为什么大厂这么爱用protobuf? https://mp.weixin.qq.com/s/COQu3rckfZJUelSVBV6IMA

为什么大厂这么爱用protobuf?

 

话题背景

protobuf在国内兴起的时候,json over http 的 RESTful ,api也在国内同步兴起了。司内也有很多api是tRPC写的,很多是基于protobuf的,也有很多就是 json over http 的。
那么有同事就有这个疑问了:这里面只有protobuf的数据结构最复杂,而且打开任意一个 protobuf 的 java 文件都会让机器卡顿很厉害,很难想象前人在通过protobuf 来理解数据结构的时候,是不是一样非常麻烦?
那么推动我们使用这项技术,让它们在很多团队之间占据统治地位的根本原因是什么?是某些历史团队的背景偏好么?该如何解决打开文件卡顿的问题?

 

今天就让我们来一起聊聊“为什么大厂这么爱用protobuf?”

 

鹅厂工程师的看法



@ashui-IEG后台开发工程师


protobuf 的好处很多的,不只是序列化还有一些微服务接口声明(IDL)。

序列化反序列化

序列化与反序列化的性能 这个不用多说,简单了解下原理就能理解,性能肯定比json快。

这里也有一个图,之前同事分享的:

图片

序列化:

图片

反序列化:

图片

这些在内部一些rpc 请求之间还是很可观的。
IDL (Interface description language)

我们不妨回顾一下 如果 直接使用 json over http 开发接口的过程。

1.  编写接口 定义路由 eg: /a/b/c

2.  定义好入参/出参结构 req struct rsp struct

3.  解析入参(解析http从 query or body 拿到入参 放入 req

4.  业务处理逻辑

5.  准备rsp struct 返回

对于小规模业务来说,或者说不怎么迭代的系统来说,这样确实还行。

但是随着业务的发展,你现在有100个接口你其实根本无法维护这些接口的,比如 前端来找你 要知道 /a/b/c 接口的入参出参(接口文档),如果你们有维护 swagger 那还好说,不然你只能说一句我先去看下代码.....protobuf 的好处通过 pb 去定义Interface ,并且提供插件能力能让你自己去解析pb,开发自己。

图片

比如 trpc-go 就是基于pb的接口定义+自行开发的插件 去生成代码桩。

甚至如果你真的还是想用 json over http 的模式也行,用 pb 定义接口,通过自己开发插件将 pb 生成http 代码桩,业务开发只需要关注 核心的 业务处理逻辑,其他都可以代码生成。

对于接口文档的维护完全都不需要专门去写文档,你改了pb,文档就自己生成了....

当然你也可以去生成 swagger,前端 ts 结构,客户端 java 接口..... 一套pb 大家一起享福。
随着这些插件开发的越多(生态也就好起来了)

 


 


@titus-IEG运营开发工程师


说实话,我觉得jce比protobuf要好用,但是没办法,生态位置还是领先,开源组件全在用它。

 

 


 


@thomas-TEG后台开发工程师


举个例子,json 没有 schema,今天加个字段,明天改个类型,到时候上下游对接都不知道 json里面到底传什么类型。选 protobuf,变更的时候在代码仓库里至少知道改了那个字段,上下游对接只要根据 schema 定义就知道。

图片

 


 


@jinlong-PCG后台开发工程师


上家公司用过json,在c++里面解析json简直就是灾难,因为不知道上游会传过来啥,每次要先判断是否存在这个字段,然后再判断类型是否正确,稍不注意就可能导致core。pb强 schema 且强制兼容,在开发的时候能省不少工作量,减少一些异常失误。当然缺点就是要看里面的内容每次都要解析。

图片


 


@ronaldo-IEG后台开发工程师


绝大多数用pb的团队,考虑的首要问题都不是序列化性能。主要考虑

1.  需要一种统一的编程语言无关的方式来定义服务的接口,它就是文档,而且一定是最新的文档。它需要足够有表达力,又足够简洁明了,其实就是IDL(可选:pb thrift)

2.  在IDL的前提下,找生态最好的,支持语言最多的(pb)

3.  在2的前提下找性能尽可能高的(不用挑了)

图片


 


@erien-TEG数据工程师


主要是强schema化吧,跨语言序列化需求才是其次的。数据结构复不复杂是业务的问题,你说的proto是ams大仓里的proto吧,经过了这么多年迭代也正常,idea使用的话建议忽略编译生成的java文件,直接用proto插件识别proto文件里的字段。

图片


 


@andy-TEG应用研究工程师


如果从实际使用情况来看:

1.  rpc上的 capn proto, flatbuffers这些效率更高但社区不够大

2.  big data上基本都用上arrow了,protobuf现在很少了

3.  web和相关的社区一直是json为主

另外从纯编解码效率来看,protobuf对比json的优势不是格式问题而是实现问题(如果不是用json over http1.1 vs protobuf vs http2 aka grpc来对比的话),所以感觉还是各个社区的历史原因吧。

图片


 


@quinn-TEG应用开发工程师


Json重在可读性,一般前端交互用很广泛,小巧且便于调试。Protobuf重在高性能,在性能要求较高的地方,比如后端协议这块比较有优势,调试起来没json顺手,因为是二进制的,非明文。

 


 


@chair -IEG SRE工程师


手游当年刚起来的时候, 世界移动网络大多处于2G和3G的状态,当时我去了神奇公司内,入职要算八字的那家。他们的大厅就是用json传的数据。我过去之后,看了一下pb的特征,就选定用pb替换json。结果原本要12秒才加载完毕的大厅列表,用了pb,3秒,用户反应快了很多。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MS Projcet 和 Redmine 在进行项目管理的时候有什么区别

在进行项目管理的时候,MS Project和Redmine有以下主要的区别:1.平台属性不同;2.功能侧重点不同;3.使用者不同;4.兼容性不同;5.成本差异。总的来说,MS Project适用于规模较大、复杂度较高的项目管理,而Redmine适用于小型团队、开源社区以及迭代开发速度较快的项目管理。…

恶意 Prompt 攻击

黑掉大模型?恶意 Prompt 攻击成无解之谜? https://mp.weixin.qq.com/s/vliCct-0PwEdaGFSpYt9tQ 黑掉大模型?恶意 Prompt 攻击成无解之谜? 原创 Atone 腾讯技术工程 2024年11月01日 17:35 广东作者:Atone,混元安全防守团队成员 随着大模型应用的逐步发展,出现了一种新型的…

『模拟赛』多校A层冲刺NOIP2024模拟赛17

『模拟赛记录』多校A层冲刺NOIP2024模拟赛17Rank 一般A. 网络 签不上的签到题。 首先考虑枚举路径的做法,如果先枚举再计算的话复杂度会是 \(\mathcal{O(\binom{n+m-2}{n-1}(n+m))}\) 的,稍微优化一点的过程中可以去掉后面的 \((n+m)\)。考虑此时我们要记什么,首先遇到加号其…

rust学习五、认识所有权

在<<The rust programming language>>的中译版<<rust权威指南>>中,作者用了30页的篇幅来阐述这个问题。 如作者所言,所有权是学习rust语言的基础,不掌握这个,无需继续往下,所以,这是初学rust就必须会的。正是所有权概念和相关工具的引入,Rust才…

给予爱快路由器使用阿里云DDNS远程访问家庭网络

一、阿里云域名准备1、首先需要购买一个阿里云域名,选简短好记性价比高的即可,如果域名只是用来解析路由器IP地址,不做服务器类应用,则不需要备案。 2、想做动态域名解析,光有域名还不行,还需要在阿里云控制台建立一个访问授权,路由器才能动态同步远营商的IP地址到DNS服…

KingbaseES V8R6集群备份恢复案例之---主库single-pro备份恢复

KingbaseES、repmgr、sys_rman案例说明: KingbaseES V8R6集群物理备份支持single-pro方式,本案例在集群执行single-pro方式备份并多次切换集群后,对集群执行了恢复测试,文档记录了恢复的详细过程。 适用版本: KingbaseES V8R6 集群架构:ID | Name | Role | Status …

号码变换配置对接运营商IMS

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs直接对接运营商,调试过程中的号码变换规则比较容易出问题。 本文档记录一个较为通用的对接IMS配置方案。 环境 CentOS 7.9 freeswitch 1.10.7 模块配置 号码变换主要使用mod_translate模块和dialplan拨号计划实现。 确…

Idea上Git仓库不见了是什么原因

在使用IntelliJ IDEA进行项目开发时,Git仓库突然消失是开发者常遇到的问题。该问题可能由多个因素引起,包括:1.环境配置问题;2.软件或插件更新;3.目录结构变更;4.用户权限问题;5.其他软件干扰。理解这些因素并采取相应的解决措施,不仅能快速恢复Git仓库,还能避免类似问…

【算法学习】扫描线

这篇题解写的难以言喻,可能只有我能看的懂! 前言 虽然我觉得这个算法目前不太可能会考,但是我觉得挺有意思的,而且学个算法也挺好,我是为自己学的!!! 定义 扫描线可以求二维图形的面积,也可以求周长等多种用途…… P5490 【模板】扫描线 & 矩形面积并 这就是扫描线…

leetcode 740 删除并获得点数

740 删除并获得点数 题意 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。 开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。…

Navicat 17下载与安装

1、安装包 Navicat 17: 链接:https://pan.quark.cn/s/c75e892c4705 提取码:YvyF Navicat 16: 链接:https://pan.quark.cn/s/63c07b20ea7b提取码:B9ij 2、安装教程(这里以安装Navicat 17 为例) 1) 如之前已安装的需卸载当前Navicat,如未安装,直接双击无限试用…