网络通信序列化协议的选择
来源:互联网 发布:北京西红门火灾 知乎 编辑:程序博客网 时间:2024/05/06 02:03
一、背景介绍
由于历史原因,使用了兄弟公司的框架,导致之前的通信序列化协议强制用的JSON。我们项目为一个web项目,前端as,后端php+java,一开始只有as与php短连接,后来为了一些逻辑的实时消息,加了java来另作的长连接。
as与php都是弱类型的语言,用JSON来序列化,网络通信逻辑可以写的很随意,这导致我们现在查问题非常棘手。另外JSON也浪费了些流量。现在项目在扩展手机前端,对流量的要求更苛刻。为了新老问题的选择,我们就要换掉JSON。
二、序列化协议选择的考虑
手机前端使用C++写的逻辑,我们协议的要求为跨语言、跨平台、体积小、序列化和反序列化快。
可供选择的协议有protobuf/thrift/messagepack等。
1. thrift的学习成本貌似比protobuf高些,另外先看的protobuf,感觉两种协议差不多,就懒的继续研究thrift了。
2. protobuf和messagepack的取舍:
两种皆是开源项目。
(1)protobuf是google主持的,已经被google自己和业内大规模使用了,证明是可靠的;而messagepack貌似出来的比较晚,还没被大规模使用。
(2)语言支持,protobuf官方原生支持C++、Java、python,其他均为第三方扩展;messagepack官方支持C++、Java、php,不支持as,但支持js。
(3)protobuf有个编译器可以自动生成各语言对应版本的协议类;messagepack在强类型如java和C++里就需要自己写各个语言版本的了。
(4)体积方面,messagepack的体积应该比protobuf稍大。
(5)速度方面,messagepack官方说速度是protobuf的4倍,但是看他的测试只是一种语言的测试。
(6)其他,messagepack也支持key-value方式的序列化,号称体积小的JSON。这虽很容易移植以前的协议,为了快速出demo,我也都准备用messagepack先期试改了,但是猛然发现每个语言还是得写各自的,而且现在涉及到两种不同前端,一段的修改还需及时通知另一前端做相应修改。这种太难控制了,没有protobuf的proto文件那种的一致性保证。
三、最终选择
综合以上的比较,最后选择了protobuf来作为我们项目新的网络通信序列化协议。
- 网络通信序列化协议的选择
- 移动App通讯协议及序列化方式的选择
- Websocket一个持久化网络通信的协议
- 疯狂java UDP协议的网络通信
- 基于TCP协议的网络通信
- Android 基于TCP协议的网络通信
- 网络通信开源库选择
- 网络通信及协议
- 互联网协议 网络通信
- java 网络通信封装协议-一个简单的TGP协议
- 如何通过序列化在网络间传递对象,网络协议:轻松定义自己的网络通讯协议
- 常见的序列化协议
- 网络通信、网络协议与网络编程
- java网络通信中序列化对象的类所在包名必须完全相同
- 13.进程间通信---网络通信(TCP协议和UDP协议的比较)
- 最浓缩的基于TCP协议的网络通信详解
- 基于nio的java网络通信框架介绍和选择
- android 开发 常用到的一些网络通信包选择
- Hadoop 的命令笔记
- virtualbox ubuntu虚拟机安装配置android开发环境(eclipse+ndk+sdk)及注意事项
- hdu1317 bellman-ford+floyd
- 常用数据库基本数据类型
- IOS疯狂基础之多线程编程NSThread
- 网络通信序列化协议的选择
- DWR3常见错误解决方法
- Jms两种message传输方式Topic和Queue的比较
- class与struct的区别总结
- bash中 2>&1 & 的解释
- Codeforces 25D. Roads not only in Berland 并查集
- Java MemCached 简单封装
- 《鸟哥的linux私房菜 基础篇》第七章读书笔记(上)--pwd,mkdir,rmdir,PATH,cp,rm,rename,mv
- struts2面试题