开发知识

JSON, Protobuf, Thrift和MessagePack的优缺点对比

来源: 科学随想录  日期:2024-04-22 21:15:59  点击:38  属于:开发知识

最近咱们公司内部搞了个技术交流,讨论起了序列化协议怎么选。我觉得这话题挺有意思的,就顺手整理了一下现在主流的序列化协议的优缺点。这样一来,以后查起来也方便。

JSON

先说说 JSON,这货读起来挺舒服,用起来也简单。扩展性和兼容性都不错,能在不同语言之间传来传去结构化数据。

但 JSON 也有缺点,比如体积大,影响性能,尤其是高并发的时候。还有就是缺乏命名空间,有时候信息会乱成一团。

总结起来,JSON 是个简单通用的应用协议,用得挺广,开发效率挺高,但性能一般,维护成本也偏高。

Protobuf

接下来是 Protobuf,这货是个高性能、易扩展的序列化框架。

优点很明显,跨语言,向后兼容,新增字段不影响已有的协议。代码自动生成,用起来简单。二进制消息,效率高,性能好。而且安全性也不错,只写字段号,编码成二进制,破解难度大。

缺点嘛,二进制消息可读性差,字段冗余,类文件会越来越大,维护成本高。而且 Protobuf 只管序列化和反序列化,RPC 功能得另请高明。

RPC 是啥?就是远程过程调用,一个机器(客户端)调用另一个机器(服务器)上的函数或方法,然后拿到结果。RPC 会隐藏底层通信细节,不用你直接处理 Socket 或 Http 通信,用起来就像调用本地函数一样。

总结 Protobuf,上手简单,高效,兼容性强,但维护成本也高。

Thrift

Thrift 是 Facebook 2007年开发的跨语言 RPC 框架,支持多语言编译,提供多种服务器工作模式。

优点是序列化和 RPC 一站式解决,比 Protobuf 方便。跨语言,IDL 接口定义语言,自动生成多语言文件。省流量,体积小。包含完整的客户端/服务端堆栈,RPC 实现起来快。服务端有多种工作模式,比如线程池、非阻塞模型。

缺点是不支持双通道,RPC 方法非线程安全,服务器容易被挂死,需要串行化。默认不具备动态特性,开发环境和编译有点麻烦。

总结 Thrift,跨语言,实现简单,但初次使用有点麻烦,得注意使用问题和场景限制。

MessagePack

MessagePack 是一种高效的二进制序列化格式。

优点是跨语言,多语言支持。序列化反序列化效率高,文件体积小,比 JSON 小一倍,还兼容 JSON 数据格式。

缺点是缺乏复杂模型支持,对复杂数据类型(List、Map)支持不够。序列化没问题,但反序列化回来就麻烦了,尤其是对 Java 开发人员来说。维护成本也高,因为 MessagePack 通过值的顺序来定位属性,不同语言中都得维护一样的模型和属性顺序。还不支持模型嵌套。

总结 MessagePack,性能高,但扩展性差,维护成本高。

哦,对了,在整理的时候我还有点疑问。有人说 MessagePack 的序列化和反序列化效率是 Protobuf 的 4 倍,我个人表示怀疑。后续的文章可能会对这两个协议做个细致的对比。

好了,今天的分享就到这儿,希望对你有帮助。有啥问题咱们再讨论!