作者曾经在2014年测试出MSGPACK的关键字和中文字符有很大的冲突,所以后来放弃了,本文为很多年前写的一个对比,后来我们一直在使用HTTP协议和PROTOBUF。

看看MSGPACK的文档,自称效率高于其他同类产品最高8倍,很诱人吧?来看看我的故事吧

首先很多项目是跨语言的,我们也不例外前端AS3,后端C++,本身我是冲着MSGPACK支持语言多,效率高用的,因为都知道AS3本身效率很低,如果解析效率低就悲剧了,这个时候我还没开始使用PROTOBUF,也从来没用过PROTOBUF,至少我否定了很多开发者说要用PROTOBUF的观点,然后强压下迫使他们使用MSGPACK,接着开始了漫长的整合,不要迷信官方的那些第三方库,大部分都不更新了这是其次,重点是你自己是需要做出很多修改的,我们为了让他可以完整的支持跨语言对应对象,对AS3我们做出大量修改,最终可以勉强对应部分内容,但是要注意的事情还是很多,这个时候的MSGPACK还是很脆弱的,至少在AS3上来说。

接着第一个悲剧发生了,这里其实我比较庆幸他发生在项目初期而不是项目中后期,根据快速开发原则,如果发生在中后期我所付出的成本远远要大于开发这个系统本身3~15倍甚至还多,这个悲剧就是中文发送文本出现截断,而截断的发生方是服务器端,也就是C++版本由官方提供的解析类库,你以为我会马上放弃MSGPACK?你错了,我马上去找了解决方法,调试,读MSGPACK大量文档,最终我发现的GBK的文本中含某个汉字拆开的字节中含有0xce,而这个实际上是代表MSGPACK的UINT32的,所以可想而知这里开始发生截断,无法继续分析,接着服务器端崩溃。

不幸的是这不是最大的问题,接着我的确找到的解决方案BASE64,方案的代价是我必须多写一个LAYER来处理BASE64的转换,其次使用复杂度和自由度上明显出现差别,数据包略微增大,此劫暂时渡过了,接下来我发现,我需要教会其他人怎么使用MSGPACK来打包数据包。

接下来的几天内我又写了更加简单的组合类,但是我发现还是很复杂,至少需要3行才能发送一个MSGPACK,但是还好至少三行了。

接着其他人开始学习使用MSGPACK,这时距离我刚刚选定MSGPACK已经过去2周了,当然我觉得这是新东西应该这样,接下来的噩梦来了。

第一个包LOGIN_SYN,我们开始协调每个细节可有一个很麻烦的问题,SESSION CODE是INT64,如何对应AS3,我们测试很久后来还是自己写了BIGINT类,然后完成对应,噩梦越来越多。

直到有一天,所有人开始抱怨这东西难用,要写很多额外的PROTOCOL类的时候,迫于团队压力我决定试试PROTOBUF。

而接下来我感到震惊从使用开始到直接投入生产,我们仅仅用了4个小时,而这4个小时我们大部分时间花费在让PROTOBUF的工具可以产生AS3的协议类。

我们做法是:

1、找到最新的PROTOBUF官方源码 (5分钟左右,含下载时间)

2、编译C++版本的WINDOWS工具(10~15分钟左右,含编译时间,全版本编译包括C++类库)

3、找到AS3生成类和AS3的解析类放入AS3项目(2个小时左右,下载与项目整合,修改底层时间)

4、接着编译和整合C++版本的工具(1小时20分左右,把AS3的生成代码放入工具,整合修改C++底层,然后编译)

5、接下来发送第一个包(30分钟左右,写一个协议并生成,做个批处理自动生成AS3和C++类)

*以上记时是为某人无聊记得,这里刚好拿来用了,他是PROTOBUF主张派,非要记录时间看看能缩短多少。

前后我们仅仅用了4个小时,我是第一次使用PROTOBUF,但是它简单到让我震惊,我真的从没想过写协议可以如此简单。

接着我仅仅封装了一下我的协议和AS3的发送类做对接整合,仅需2行代码,就可以发送完整包,而所有的写类均可以通过工具生成整合,整个研发时间缩短了太多太多,而且几乎不用教学,所有新手学会如何使用PROTOBUF。

看到上面你们就知道,对于生产力的问题上,效率上说的天花乱坠也是扯淡,现在回想使用MSGPACK生产,光写PROTOCOL的类我想我们的成本就不知道要多少,而且我们要重新维护一个HTML的协议文档或WIKI(方便在线查阅),让前端同事明白,否则必定大乱。

目前我们已经使用PROTOBUF整合了40几个数据包,包括服务器之间,客户端服务器之间等,我们仅仅需要一个叫做SVN的东西就可以让客户端同事100%明白这个协议发来的是什么和他要处理什么,我一直是写自有协议的总是要解释很多,还要加很多注释,可我现在认为PROTOBUF才是王道啊,太快了。

如果你是负责的总监或负责的老板,请不要让员工浪费时间在毫无意义的事情上,甚至为此付出巨大的代价,而生产力低下往往会拖垮你整合项目甚至让你破产。

由此深刻的感受到,MSGPACK实际生产力相对于PROTOBUF并不高,不管效率如何高,其实对于多人协调的项目以及跨语言项目他仍旧是个很麻烦的东西。

这两者最大的区别应该是PROTOBUF是为了快速生产而诞生的,而MSGPACK不是,所以在正规项目中用MSGPACK和PROTOBUF也毫无疑问的是PROTOBUF

 

MSGPACK和PROTOBUF的故事(MSGPACK明显生产力不足)的更多相关文章

  1. msgpack和protobuf的对比

    msgpack和protobuf的对比 msgpack的序列化速度比protobuf要快一些,但反序列化要比protobuf要慢一些,但总体都接近msgpack可以直接序列化类对象,但protobuf ...

  2. Go语言中的数据格式(json、xml 、msgpack、protobuf)

    在分布式的系统中,因为涉及到数据的传输,所以一定会进行数据的交换,此时就要定义数据交换的格式,例如二进制.Json.Xml等等.本篇文章就是总结一下常用的几种数据格式. 一.Json格式 如果想使用J ...

  3. 【SimpleMsgPack.NET】发布一个msgpack协议C#版本的解析开源库

    这两年一直都关注这IOCP在网络通信这方面的应用,当然数据的传递是经常需要的.今年接触了MsgPack格式,发现他用来做传输时数据打包真是太爽了.因为他可以直接打包二进制数据,不需要任何的转换.有人会 ...

  4. pecl install msgpack

    Before the beginning: There are two php version, php5.5, php7.1. we need to install msgpack under ph ...

  5. web api\ protobuf \formatter

    9:50:20吴X2014/11/7 9:50:20 9:55:14吴X2014/11/7 9:55:14webapi实现protobuf吴X2014/11/7 9:56:29http://www.s ...

  6. ZYSocket 4.3.5 SOCKET框架组 发布[NEW]

    最新代码请到 github: https://github.com/luyikk/ZYSOCKET 更新 4.3.5更新说明: 修复各种BUG. 重写了一份 protobuf-net 有什么用呢,不需 ...

  7. netty中级篇(2)

    上一篇 netty入门篇(1) 一.编码解码技术 如何评价一个编解码技术: 是否支持跨语言,或者说支持的语言是否丰富 编码码流大小,影响传输速度 编码和解码的性能,即时间 类库是否精致,API是否方便 ...

  8. 用Netty开发中间件:网络编程基础

    用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...

  9. .net core高性能通讯开源组件BeetleX

    BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便.性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的T ...

随机推荐

  1. 【转载】Allegro Auto Rename器件反标注教程

    Cadence设计时一般不主张在PCB文件中更改Logic(PADS的ECO更改),不过Auto Rename仍然是非常实用的功能,按照布局重排位号,可以让PCB的丝印标识更清晰,容易检查,位号易找, ...

  2. element resetFields 方法报错

    resetFields  对整个表单进行重置,将所有字段值重置为初始值并移除校验结果:如果用了之后报错如下: 查了下资料,是DOM加载的顺序问题: 解决方法: this.$nextTick(() =& ...

  3. python 的os的总结

    转:http://www.cnblogs.com/BeginMan/p/3327291.html

  4. Linux IO 监控与深入分析

    https://jaminzhang.github.io/os/Linux-IO-Monitoring-and-Deep-Analysis/ Linux IO 监控与深入分析 引言 接昨天电话面试,面 ...

  5. linux中标准输出相关

    linux标准输出相关 http://blog.sina.com.cn/s/blog_5e99b41e0100tjtx.html

  6. VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法

    1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...

  7. 蓝桥杯 算法训练 ALGO-34 纪念品分组

    算法训练 纪念品分组   时间限制:1.0s   内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购 ...

  8. 【转】Jmeter笔记:响应断言详解

    平时我们使用jmeter进行性能测试时,经常会用到断言.jmeter提供了很多种断言,本来想全都写一下,但发现每一个断言里面的东西都很多,所以就先写一下我们经常使用的响应断言. 第一次在cnblog上 ...

  9. mysql 常见参数

    my.cnf[client] 对mysql的所有客端都生效的[mysql] 只对mysql这个命令有效了[mysqd][mysqld_multi] 多实例启动[mysqld_safe][mysqldN ...

  10. Oracle常见的表连接的方法

    1 排序合并连接SMJ Sort merge join 排序合并总结: 1 通常情况下,排序合并连接的效率远不如hash join,前者适用范围更广,hj只使用于等值连接,smj范围更广(<,& ...