作者曾经在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. gradle 安装试用

    1. java 环境(jdk 6 以上,最好使用8以及以上) yum install -y java-1.8.0-openjdk-devel 2. 基本配置 // path 路径 export PAT ...

  2. 使用DeflateStream压缩与解压

    具体可以了解下:http://msdn.microsoft.com/zh-cn/library/system.io.compression.deflatestream(v=vs.110).aspx / ...

  3. 在C#获取麦克风输入的声音的波形图

    怎么获取声音波动的频率,在网上找来一些这方面的资料: DirectX的 DirectSound http://zhidao.baidu.com/question/448587955.html http ...

  4. 系列文章--SQLite文章

    SQLite 随机取n行的方法   SQLite多线程写锁文件解决方案   sqlite和sql server语法上的一些区别   sqlite编程插入标示字段,获得新id   C# SQLiteHe ...

  5. AES前后加密算法代码

    首先下载aes.js加密工具类: 本文采用的是 AES/ECB/PKCS5Padding的加密方式进行加密的: js加密写法如下: <!DOCTYPE html> <html lan ...

  6. WebService简单实现

    1. WebService SOAP.WSDL.UDDISOAP(Simple Object Access Protocal,简单对象访问协议),是在分散或在分布式环境中交换信息的简单协议.WSDL( ...

  7. Qt5.4中遇到找不到头文件<QApplication>等。

    从新学习Qt时,重装了Qt5.4,当运行Hello World例子时,遇到了下列的情况 <span style="font-size:18px;">#include & ...

  8. 【转】JMeter基础之——一个简单的性能测试

    上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...

  9. java图形用户界面BorderLayout布局。冲突

    总结:在使用边界布局发现,把所有的按钮组件都放入了panel.但是在中部的按钮组件找不到了.发现自己重复用了组件 1.this.add(bt4,BorderLayout.North); 2.panel ...

  10. Unity Shader入门精要读书笔记(三)Shader必须的数学基础

    Xyz三维坐标系如下:左手坐标系 但是摄像机观察空间则是采用右手系: 右手法则判断叉乘的结果的方向: 正交矩阵(单位互相垂直的基矢量构成正交矩阵)具有逆与转置一致性: 列矩阵运算CBAv和行矩阵的运算 ...