MSGPACK和PROTOBUF的故事(MSGPACK明顯生產力不足)


作者曾經在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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM