热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MessagePack、Avro、Thrift、ProtocolBuffers、JSON序列化协议

在Web开发中,难免遇到需要跨语言甚至跨平台进行通信的场景,不论是PHP到C还是PHP到Java,或者C到Java,都需要双方有一个约定的协议来打包和解包所传输的数据。双方自定义的协议固然效率高,但是

在Web开发中,难免遇到需要跨语言甚至跨平台进行通信的场景,不论是PHP到C还是PHP到Java,或者C到Java,都需要双方有一个约定的协议来打包和解包所传输的数据。双方自定义的协议固然效率高,但是通用性差,因此便出现了本文将要讨论的这些通用的、跨平台的数据打包协议。这些协议各有特点,应用场景也不尽相同,本文试图从某些我们经常会关注的角度来对这些序列化协议进行比较,以期能够为我们做技术选型提供指导。

文中提到的这些东西,可以说是协议、工具或者类库,因为他们都包含:一个数据序列化/反序列化协议&实现改功能的代码,有些还提供了发布RPC Service的API。所以当你看到我用不同方式称呼它们的时候不要觉得困惑。

关于这些协议:

首先我们简单看一下这些协议的官方介绍,大致对他们有一些了解。

MessagePack:

MessagePack is a binary-based efficient object serialization library. It enables to exchange structured objects between many languages like JSON. But unlike JSON, it is very fast and small.

MessagePack(以下简称MP)是一种基于二进制的对象序列化协议和库。它像JSON一样可以用于在多种语言之间交换结构化的数据,但是不同的是它比JSON更小更快。并且MP也提供了远程调用(RPC)功能

Avro:

Apache Avro™ is a data serialization system.

Apache Avro是一个二进制的数据序列化系统。介绍够简单,实际上Avro除了序列化之外,像MP一样也提供了远程调用(RPC)功能。Avro是属于Hadoop的一个子项目,由Hadoop的 创始人Doug Cutting牵头开发,设计用于支持大批量数据交换的应用。

Thrift:

The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Javascript, Node.js, Smalltalk, OCaml and Delphi and other languages.

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Javascript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

Thrift是由Facebook主导开发的,目前也是Facebook的核心系统之一。

Protocol Buffers:

Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats.

Protocol Buffers(以下简称PB)是Google开发的一种数据描述语言,高效、可扩展。Google内部远程调用以及数据存储大量使用了PB的结构。PB仅仅是一个序列化协议,并不包含RPC部分。

JSON:

JSON (Javascript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate.

JSON的官方介绍很长,因为大家都比较熟悉,我没有全截取下来。和上面几个不同的是,JSON是纯文本格式的,无疑在可读性上JSON是最好的。并且JSON因为出现的比较早,目前应用范围也是非常的广泛。

更多的信息,大家可以移步各官方网站,上面有比较全的介绍和示例什么的,对于想深入了解非常有帮助。

语言支持:

因为我们需要的是跨平台跨语言的协议,所以它们所能支持的语言是我们必须关注的。在每一个协议的官网上都列出了长长一串所支持的语言列表,因为工作环境,我并用不到这么多语言,所以后面我也不会挨个去尝试这些语言。但这里作为总体介绍,我姑且把这些语言都整理出来(有些实在是太冷门了,我都不知道是什么):

MP Avro Thrift PB JSON
ActionScript N N Y Y Y
ASP N N N N Y
Bash N N N N Y
BlitzMax N N N N Y
C Y Y Y Y Y
C++ Y Y Y Y Y
C# Y Y Y Y Y
Clojure N N N Y Y
Cobol N N N N Y
ColdFusion N N N N Y
D Y N Y Y Y
Delphi N N Y N Y
E N N N N Y
Erlang Y N Y Y Y
Fantom N N N N Y
Go Y N Y Y Y
Haskell Y N Y Y Y
haXe N N N N Y
Java Y Y Y Y Y
Javascript Y N Y Y Y
Lasso N N N N Y
Lisp N N N Y Y
LotusScript N N N N Y
Lua Y N N Y Y
Matlab N N N Y Y
Mercury N N N Y N
Node.js Y N Y N Y
Objective C N N Y Y Y
Ocaml Y N Y Y Y
OpenLaszlo N N N N Y
Perl Y Y Y Y Y
PHP Y Y Y Y Y
Pike N N N N Y
PL/SQL N N N N Y
PowerShell N N N N Y
Prolog N N N N Y
Puredata N N N N Y
Python Y Y Y Y Y
QT N N N N Y
R N N N Y Y
Racket N N N N Y
Rebol N N N N Y
RPG N N N N Y
Ruby Y Y Y Y Y
Scheme N N N N Y
Squeak N N N N Y
Symbian N N N N Y
Scala Y N N Y N
Smalltalk N N Y N N
Tcl N N N N Y
Visual Basic N N N Y Y
Visual FoxPro N N N N Y
列表老长老长,我想没人能够对上面的全都掌握吧。根据我的工作需要,我将只关注C/C++、Java、PHP这三种语言,后面的介绍和分析都将围绕这三个语言的环境来进行。幸运的是,我要比较的这些工具都支持这三种语言。

关于测试用例:

后面所有的测试中,为了使测试尽量公平我都将使用统一的测试用例。因为JSON是目前最最广泛使用的格式,我的测试都将以JSON作为基准进行。我将通过一些PHP程序生成所需要的测试用例,并以JSON格式保存。考虑到生产环境中经常遇到的情况,我构造了以下几种测试用例:

用例一(少量简单数据):

有时候我们的项目接口只会交互很小的数据量,比如一个单独的整型数。仿照这种情况,我定义一个仅包含几种普通数据类型各一的结构:

用例二(大量简单结构数据):

用例二模仿我们调用某个批量接口获取批量数据,我们要传入大量的ID或者Key,这里我构造了一个包含10000个ID的数组:

用例三(大量复杂结构数据):

批量接口返回的数据,我构造了一个member结构,随机生成里面的内容,循环生成10000个这样的结构模拟批量接口的返回的数据。

用例四(单条巨复杂结构数据):

有时候我们可能会请求一个字典,字典格式是key=>value格式,这类似于一个有n多字段的单条数据。尽管这个类比不是很合适,但是我们测试avro和thrift的时候就会发现这个测试用例还是挺有必要的。这里我生成一个具有10000个字段的单条数据。


推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • PHP编程能开发哪些应用?
    导读:很多朋友问到关于PHP编程能开发哪些应用的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • CentOS7系统目录LINUX有四种基本文件系统类型普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
author-avatar
雨过后放晴
若言琴上有琴声,放在匣中何不鸣?
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有