网络通信序列化协议的选择
背景介绍
由于历史原因,使用了兄弟公司的框架,导致之前的通信序列化协议强制用的 JSON。我们项目为一个 Web 项目,前端 AS3,后端 PHP + Java,一开始只有 AS 与 PHP 短连接,后来为了一些逻辑的实时消息,加了 Java 来另作的长连接。
AS 与 PHP 都是弱类型的语言,用 JSON 来序列化,网络通信逻辑可以写的很随意,这导致我们现在查问题非常棘手。另外 JSON 也浪费了些流量。现在项目在扩展手机前端,对流量的要求更苛刻。为了新老问题的选择,我们就要换掉 JSON。
序列化协议选择的考虑
手机前端使用 C++ 写的逻辑,我们协议的要求为跨语言、跨平台、体积小、序列化和反序列化快。
可供选择的协议有 Protobuf、Thrift、MessagePack 等。
Thrift 的学习成本貌似比 Protobuf 高些,另外先看的 Protobuf,感觉两种协议差不多,就懒的继续研究 Thrift 了。
Protobuf 和 MessagePack 两者皆是开源项目,对比:
- Protobuf 是 Google 主持的,已经被 Google 自己和业内大规模使用了,证明是可靠的;而 MessagePack 貌似出来的比较晚,还没被大规模使用。
- 语言支持,Protobuf 官方原生支持 C++、Java、Python,其他均为第三方扩展;MessagePack 官方支持 C++、Java、PHP,不支持 AS,但支持 JavaScript。
- Protobuf 有个编译器可以自动生成各语言对应版本的协议类;MessagePack 在强类型如 Java 和 C++ 里就需要自己写各个语言版本的了。
- 体积方面,MessagePack 的体积应该比 Protobuf 稍大。
- 速度方面,MessagePack 官方说速度是 Protobuf 的 4 倍,但是看他的测试只是一种语言的序列化测试。
- 其他,MessagePack 也支持 key-value 方式的序列化,号称体积小的 JSON。这虽很容易移植以前的协议,为了快速出 Demo,我也都准备用 MessagePack 先期试改了,但是猛然发现每个语言还是得写各自的,而且现在涉及到两种不同前端,一端的修改还需及时通知另一前端做相应修改。这种太难控制了,没有 Protobuf 的 .proto 文件那种的一致性保证。
最终选择
综合以上的比较,最后选择了 Protobuf 来作为我们项目新的网络通信序列化协议。