RPC通信编解码库对比:json、flatbuf、protobuf、MessagePack

2023-12-19 17:36

本文主要是介绍RPC通信编解码库对比:json、flatbuf、protobuf、MessagePack,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JSON:
 1、JSON是纯文本。
 2、JSON具有良好的自我描述性,便于阅读。

优点

1 简单易用开发成本低
2 跨语言
3 轻量级数据交换
4 非冗长性(对比xml标签简单括号闭环)

缺点

1 体积大,影响高并发
2 无版本检查,自己做兼容
3 片段的创建和验证过程比一般的XML复杂
4 缺乏命名空间导致信息混合

总结:最简单最通用的应用协议,使用广泛,开发效率高,性能相对较低,维护成本较高。

如果对性能要求不高,传输数据少,优先选择这个,现在大部分使用的是这个;

protobuf:
  Protobuf是一种以有效并可扩展的格式编码结构化数据的方式。
语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序
 比较强大,如果是大数据,建议使用 protobuf 性比较好,并支持数据流;

缺点:不便于阅读,库相对较大,移动端可以使用 protobuf-lite;

1 二进制格式,可读性差(抓包dump后的数据很难看懂)
2 对象冗余,字段很多,生成的类较大,占用空间。
3 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)

总结:简单快速上手,高效兼容性强,维护成本较高;不便于阅读,库相对较大,移动端可以使用 protobuf-lite;

flatbuf
FlatBuffers是Google专门为游戏开发而创建的跨平台序列化库

对序列化数据的访问不需要打包和拆包——它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而没有任何解析开销;
内存效率和速度——访问数据时的唯一内存需求就是缓冲区,不需要额外的内存分配;
扩展性、灵活性——它支持的可选字段意味着不仅能获得很好的前向/后向兼容性(对于长生命周期的游戏来说尤其重要,因为不需要每个新版本都更新所有数据);
最小代码依赖——仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。
强类型设计——尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正;
使用简单——生成的C++代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本;
跨平台——支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好。
编码性能对比 (S)

Person个数    Protobuf    JSON    FlatBuffers
10    6.000    8.952    12.464
50    26.847    45.782    56.752
100    50.602    73.688    108.426
编码性能Protobuf相对于JSON有较大幅度的提高,而FlatBuffers则有较大幅度的降低。

解码性能对比 (S)

Person个数    Protobuf    JSON    FlatBuffers
10    0.255    10.766    0.014
50    0.245    51.134    0.014
100    0.323    101.070    0.006
解码性能方面,Protobuf相对于JSON,有着惊人的提升。Protobuf的解码时间几乎不随着数据长度的增长而有太大的增长,而JSON则随着数据长度的增加,解码所需要的时间也越来越长。而FlatBuffers则由于无需解码,在性能方面相对于前两者更有着非常大的提升。


 移动端,可以使用flatbuffers,相对protobuffer  要好一些。

MessagePack
It's like JSON.but fast and small.

msgpack不是软件,是一个标准,可以先把它看成二进制的json,“二进制json”容易让人联想到一个更流行一点的标准:BSON。如果你不知道bson是啥可以去查一下,总之msgpack和bson是同类型的竞争产品,但是msgpack无论从速度还是体积上都秒杀bson,至少在网络传输上是这样的。

MessagePack 在移动端表现并不是太好,可能优势在PC。

protobuf VS flatbuf

从几个角度来讨论:

1、接口易用性:protobuf的API易用性比flatbuf方便的不是一点点,flatbuf的接口比较难用,看一下demo就可以大概了解。

2、编码性能:flatbuf的编码性能要比protobuf低得多,前者的性能大概只有后者的一半。在JSON、protobuf、和flatbuf之中,flatbuf的编码性能最差。

3、编码后的数据长度:由于通常情况下,传输的数据会做压缩,因而又分为两种情况,编码后未压缩和压缩后的数据长度。flatbuf编码后的数据,无论是压缩前还是压缩后,都比protobuf的数据长得多,前者的大概是后者的两倍。

4、解码性能:flatbuf是一种无需解码的二进制格式,因而解码性能要高许多,大概要快几百倍的样子。

综上,protobuf在各个方面的平衡要比flatbuf要好得多,但如果使用场景中,需要经常解码序列化的数据,则有可能从flatbuf的特性获得一定的好处,就像Facebook之前的那样。

这篇关于RPC通信编解码库对比:json、flatbuf、protobuf、MessagePack的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j