隨着雲IM的發展,已吸引愈來愈多有IM需求的APP接入。但考慮到雲IM不管從商業模式仍是運營模式上,還需通過多年的沉澱,纔可能真正實現客戶與服務商的運營和服務良性循環的共贏局面。在此以前,加上有些場景下(好比爲了信息安全而不容許接入第3方雲IM的應用、IM做爲公司核心技術發展而不考慮用雲的狀況等)也確實不適合採用雲IM,因此目前開發徹底自主IM的需求和動力依然很旺盛。
但要想作好全功能、全平臺的IM,沒必定的技術積累,顯然是很難駕馭的了。正如TeamTalk的服務端設計者所說「IM的開發,從功能抽象的角度看可能很是簡單,能夠認爲是管理大量的客戶端鏈接和在不一樣的客戶端之間傳遞消息,但具體到實現細節就比較複雜了。打個不恰當的比喻,OS的功能抽象也很是簡單,無非是進程間的調度和硬件資源的管理,但要是本身去實現一個,通常人也就只能呵呵了」。
有鑑於此,不少團隊開發自主IM時,都會首先想到在開源IM的基礎上修改後,做爲已用。但話雖如此,靠譜的支持全平臺的開源IM,少之又少,這其中,蘑菇街開源的TeamTalk勉強算是一個。但正如國內大多數的開源工程同樣,對已無利的事,不多會有人真心堅持的下去。
本文將簡要介紹TeamTalk開源的過去和如今,爲打算研究和採用TeamTalk的同行提供必定程度的參考。文中所涉及內容若有不妥,還請各位看官見諒。php
(本文同步發佈於:http://www.52im.net/thread-447-1-1.html)html
- 即時通信開發交流羣: 215891622 [推薦]前端
- 更多即時通信技術資料:http://www.52im.net/forum.php?mod=collection&op=allandroid
官方網站:http://mogu.io/
官方Blog:http://tt.mogu.io/
曾今的管理者的Blog:http://www.bluefoxah.org/
Github地址1:https://github.com/mogujie/TeamTalk (2015年5月後)
Github地址2:https://github.com/mogutt (2015年5月前)git
源碼被Github下架後TeamTalk的網站給出的申明,截圖以下:
github
做爲蘑菇街官方對TeamTalk源碼與網易泡泡版權糾紛的迴應,如下是對蘑菇街研發部架構師月明的訪談全文,現摘錄以下:
2014年10月底,蘑菇街開源了其內部即時通信軟件TeamTalk,TeamTalk是一款企業辦公即時通信軟件,目前支持全部的主流平臺。正當開發者大讚蘑菇街的開源舉措時,TeamTalk於11月4日晚被GitHub下架,緣由是TeamTalk牽涉網易POPO版權。這一系列事件不由讓咱們想到開源的底線還應該是尊重,目前具體狀況還在調查中。本次訪談了蘑菇街的研發部架構師月明,以深刻剖析TeamTalk背後的細節。
Q:請先介紹一下TeamTalk這款產品以及蘑菇街開源TeamTalk的初衷。
A:TeamTalk是一款企業辦公即時通信軟件,由蘑菇街技術團隊幾位工程師利用業餘時間開發完成。在開源以前,主要用於蘑菇街內部的在線溝通。蘑菇街在創業前期擁抱開源社區並使用了不少開源軟件,這些開源軟件幫助咱們可以在技術資源有限的狀況下很好的支撐了公司業務的快速發展,在技術團隊發展壯大的過程當中,咱們逐步有一些的技術沉澱和積累,抱着感恩社區回饋開源的心態,咱們但願可以把一些優秀的軟件回饋給開源社區,不止TeamTalk,後續咱們還會陸續推出服務化框架等更多的開源項目。
Q:請介紹一下TeamTalk的架構,這麼一個支持多平臺的產品,開發須要投入不少人力吧?
A:TeamTalk的架構設計主要是參考借鑑了蘑菇街自身線上IM的架構,考慮到消息類業務應用的特性,設計上優先考慮安全性、可用性、可伸縮性。設計的定量指標是平均單機10W併發用戶以及千萬級併發在線。
從前日後看的話, 前端有支持多平臺的客戶端,包括Android、iPhone/Mac、Windows、Web,後端是負責登陸和負載均衡的LoginService,負責消息通訊的MsgService,負責調度管理和集羣擴展的RouterService,負責業務邏輯的BizService,負責存儲服務的StorageService,以及其餘系統類服務(監控服務,配置服務,日誌服務,文件傳輸服務)。 具體詳細的架構設計圖,你們能夠經過咱們的GitHub查看細節。
TeamTalk最先的代碼是從蘑菇街線上IM的一個分支拉出來的,如今主要是有5位工程師在貢獻代碼,他們大部分都是身兼多職的全棧式開發工程師,毫無疑問,現有的人員投入是遠遠不夠的,因此但願能有更多的人加入TeamTalk開源,一塊兒開發和維護TeamTalk。
Q:在開發過程當中,是否有借鑑其它IM軟件?相比來說,TeamTalk有何優勢?還有哪些方面須要改善?
A:剛纔已經提到在架構和代碼方面最大的借鑑是咱們本身線上的IM,這個線上IM主要是服務於蘑菇街本身的商家和用戶之間的閉環交流,在產品體驗操做上,咱們參考了QQ、微信等一些產品的作法,這也是讓用戶的操做習慣可以保持一致。
同比其餘IM軟件,我的以爲TeamTalk的優勢主要有如下幾點:算法
TeamTalk的不足仍是很明顯的,存在如下幾點:編程
Q:TeamTalk是如何保證消息的安全性以及可靠性的?
A:剛說到TeamTalk優勢的時候也提到了安全性,咱們經過對消息數據的在系統中6個生命週期:數據錄入、數據封包、數據傳輸、數據解包、數據存儲、數據展示進行了細緻劃分,從協議和數據兩個維度出發作了高度抽象分層設計,採用了自定義協議和自定義數據封解包處理。
爲了節省網絡流量,TeamTalk的協議是創建在TCP上的自定義二進制協議,TCP協議棧保證了數據的可靠傳輸。可是因爲移動設備的網絡不是很穩定,常常會出現一些鏈接超時斷開的問題,咱們對消息的傳輸又作了應用層方面的Ack機制,這樣當客戶端沒有收到服務器的Ack,會提醒用戶消息發送失敗。之後還會考慮加入send-wait這種機制來確保消息的可靠傳輸,即在發送下一條消息前,已經確保收到了前一條消息的Ack。同時考慮到有些內網只支持HTTP穿透,咱們後繼會考慮支持HTTP長輪詢接入,蘑菇街線上的服務器已經支持這兩種模式。
Q:TeamTalk將來的發展計劃是什麼?會增長哪些新功能?是否會搭建雲IM服務器爲你們所用?會推出付費服務麼?
A:從長遠角度,咱們的目標是但願TeamTalk可以成爲企業和開發者搭建本身IM的首選軟件,這個是理想。回到現實的話,半年以內,咱們但願可以完成如下幾個里程碑:後端
對於TeamTalk的新功能,因爲TeamTalk支持插件式功能開發,因此我認爲在開源的背景下,這個不是第一要位的事情,我想每一個開發者都會很想給本身的女神開發一個搖一搖插件,發揮你們的能動性就好。TeamTalk付費服務暫時不在咱們考慮中。
Q:11月4日,TeamTalk相關的倉庫都已經被GitHub禁用,GitHub官方解釋是TeamTalk的架構、通信協議以及部分代碼都有抄襲網易POPO之嫌。能解釋下這件事情麼?目前準備怎麼處理?
A:TeamTalk作出開源決定的初衷,是由於咱們在創業初期也使用了不少優秀的開源軟件,因此想把一些優秀的軟件也回饋給開源社區。4號11點多咱們忽然發現被下架的狀況,以後收到GitHub的下架通知,你們也很是重視,畢竟TT凝聚了工程師們的大量心血。但恰逢雙十一,並且這個雙十一是蘑菇街上線本身的電商交易平臺以來的第一個雙十一,咱們主營業務的開發壓力很是大,爲了儘快排查TT被下架的細節狀況,澄清事實,解決問題,咱們已經安排了專人在仔細地檢查代碼,並和GitHub以及POPO團隊進行積極的溝通。但從如今的情形看來,還須要多一點時間。
咱們已經向GitHub提出了申訴,同時,若是排查的結果確實存在版權問題,咱們會作出公開道歉並制定懲戒方案。安全
筆者清楚的記得,TeamTalk開源之初的github託管地址是:https://github.com/mogutt,源碼和文檔都是很齊全的,好比下面的截圖:
文檔和說明還算齊全,你還能在Github上找到當初的fork版本,好比下面這個:https://github.com/lizj3624/https-github.com-mogutt-TTServer
如今的TeamTalk託管在Github上的地址是:https://github.com/mogujie/TeamTalk,大體翻了下,源碼和文檔跟當初https://github.com/mogutt相比,源碼先不說,至少文檔上來看,比原先要簡陋了不少:
鑑於發佈之初與網易泡泡的源碼存在很大的糾紛(說白了極可能是網易泡泡的離職人員直接使用了POPO的代碼),2015年5月後的源碼(就是如今的官方託管地址:https://github.com/mogujie/TeamTalk)可能已非當初的源碼,具體能不能用,還有多少借鑑價值,就不得而之了。
原先的管理者「藍狐」於2015年7月31日發佈的博文(地址是:http://www.bluefoxah.org/teamtalk/another_tt_roadmap.html)中稱:
自從離開蘑菇街以後,蘑菇街收回了個人github代碼提交權限,這讓我很是詫異,TeamTalk是一款開源的產品,爲何全部的控制權必定要把控在某個公司手裏?我內心知道這是誰的主意,也能夠想象出來當時的場景。不事後面仍是冷靜下來思考良久。也許是他們擔憂TeamTalk的「榮譽」被我給「佔領」了。我想說的是,既然是開源產品,就該本着自由,開放,共享,貢獻,合做的精神來把TeamTalk發展起來,而不是在背後瞎BB。
雖然因爲我的緣由,離開了蘑菇街,可是一直關注着TT的發展,也一直努力去維護TT羣的氛圍,期間也在提交代碼,可是卻不明白「官方」爲何要收回我提交,審覈代碼的權限。
以上文字很少,但做爲技術同行的你,應該能想見TeamTalk這背後的「人」和「事」了,各位自行猜想吧。
先不說如今的TeamTalk源碼(地址是:https://github.com/mogujie/TeamTalk)跟發佈之初的代碼有多少淵源(當初涉及網易POPO的源碼去哪了?),官方的Github倉庫顯示至少已超過11個月無人去管了:
[1] 網絡編程基礎資料:
《TCP/IP詳解 - 第11章·UDP:用戶數據報協議》
《TCP/IP詳解 - 第17章·TCP:傳輸控制協議》
《理論經典:TCP協議的3次握手與4次揮手過程詳解》
《計算機網絡通信協議關係圖(中文珍藏版)》
《NAT詳解:基本原理、穿越技術(P2P打洞)、端口老化等》
《UDP中一個包的大小最大能多大?》
《Java新一代網絡編程模型AIO原理及Linux系統AIO介紹》
《NIO框架入門(三):iOS與MINA二、Netty4的跨平臺UDP雙向通訊實戰》
《NIO框架入門(四):Android與MINA二、Netty4的跨平臺UDP雙向通訊實戰》
>> 更多同類文章 ……
[2] 有關IM/推送的通訊格式、協議的選擇:
《爲何QQ用的是UDP協議而不是TCP協議?》
《移動端即時通信協議選擇:UDP仍是TCP?》
《如何選擇即時通信應用的數據傳輸格式》
《強列建議將Protobuf做爲你的即時通信應用數據傳輸格式》
《移動端IM開發須要面對的技術問題(含通訊協議選擇)》
《簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端》
《理論聯繫實際:一套典型的IM通訊協議設計詳解》
《58到家實時消息系統的協議設計等技術實踐分享》
>> 更多同類文章 ……
[3] 有關IM/推送的心跳保活處理:
《Android進程保活詳解:一篇文章解決你的全部疑問》
《爲什麼基於TCP協議的移動端IM仍然須要心跳保活機制?》
《微信團隊原創分享:Android版微信後臺保活實戰分享(進程保活篇)》
《移動端IM實踐:WhatsApp、Line、微信的心跳策略分析》
>> 更多同類文章 ……
[4] 有關WEB端即時通信開發:
《新手入門貼:史上最全Web端即時通信技術原理詳解》
《Web端即時通信技術盤點:短輪詢、Comet、Websocket、SSE》
《SSE技術詳解:一種全新的HTML5服務器推送事件技術》
《Comet技術詳解:基於HTTP長鏈接的Web端實時通訊技術》
《WebSocket詳解(一):初步認識WebSocket技術》
《socket.io實現消息推送的一點實踐及思路》
>> 更多同類文章 ……
[5] 有關IM架構設計:
《淺談IM系統的架構設計》
《簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端》
《一套原創分佈式即時通信(IM)系統理論架構方案》
《從零到卓越:京東客服即時通信系統的技術架構演進歷程》
《蘑菇街即時通信/IM服務器開發之架構選擇》
《騰訊QQ1.4億在線用戶的技術挑戰和架構演進之路PPT》
《微信技術總監談架構:微信之道——大道至簡(演講全文)》
《如何解讀《微信技術總監談架構:微信之道——大道至簡》》
《快速裂變:見證微信強大後臺架構從0到1的演進歷程(一)》
《17年的實踐:騰訊海量產品的技術方法論》
>> 更多同類文章 ……
[6] 有關IM安全的文章:
《即時通信安全篇(一):正確地理解和使用Android端加密算法》
《即時通信安全篇(二):探討組合加密算法在IM中的應用》
《即時通信安全篇(三):經常使用加解密算法與通信安全講解》
《即時通信安全篇(四):實例分析Android中密鑰硬編碼的風險》
《傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示》
《理論聯繫實際:一套典型的IM通訊協議設計詳解(含安全層設計)》
《微信新一代通訊安全解決方案:基於TLS1.3的MMTLS詳解》
《來自阿里OpenIM:打造安全可靠即時通信服務的技術實踐分享》
>> 更多同類文章 ……
[7] 有關實時音視頻開發:
《即時通信音視頻開發(一):視頻編解碼之理論概述》
《即時通信音視頻開發(二):視頻編解碼之數字視頻介紹》
《即時通信音視頻開發(三):視頻編解碼之編碼基礎》
《即時通信音視頻開發(四):視頻編解碼之預測技術介紹》
《即時通信音視頻開發(五):認識主流視頻編碼技術H.264》
《即時通信音視頻開發(六):如何開始音頻編解碼技術的學習》
《即時通信音視頻開發(七):音頻基礎及編碼原理入門》
《即時通信音視頻開發(八):常見的實時語音通信編碼標準》
《即時通信音視頻開發(九):實時語音通信的迴音及迴音消除概述》
《即時通信音視頻開發(十):實時語音通信的迴音消除技術詳解》
《即時通信音視頻開發(十一):實時語音通信丟包補償技術詳解》
《即時通信音視頻開發(十二):多人實時音視頻聊天架構探討》
《即時通信音視頻開發(十三):實時視頻編碼H.264的特色與優點》
《即時通信音視頻開發(十四):實時音視頻數據傳輸協議介紹》
《即時通信音視頻開發(十五):聊聊P2P與實時音視頻的應用狀況》
《即時通信音視頻開發(十六):移動端實時音視頻開發的幾個建議》
《即時通信音視頻開發(十七):視頻編碼H.26四、V8的前世此生》
《簡述開源實時音視頻技術WebRTC的優缺點》
《良心分享:WebRTC 零基礎開發者教程(中文)》
>> 更多同類文章 ……
[8] IM開發綜合文章:
《移動端IM開發須要面對的技術問題》
《開發IM是本身設計協議用字節流好仍是字符流好?》
《請問有人知道語音留言聊天的主流實現方式嗎?》
《IM系統中如何保證消息的可靠投遞(即QoS機制)》
《談談移動端 IM 開發中登陸請求的優化》
《徹底自已開發的IM該如何設計「失敗重試」機制?》
《微信對網絡影響的技術試驗及分析(論文全文)》
《即時通信系統的原理、技術和應用(技術論文)》
《開源IM工程「蘑菇街TeamTalk」的現狀:一場虎頭蛇尾的開源秀》
>> 更多同類文章 ……
[9] 開源移動端IM技術框架資料:
《開源移動端IM技術框架MobileIMSDK:快速入門》
《開源移動端IM技術框架MobileIMSDK:常見問題解答》
《開源移動端IM技術框架MobileIMSDK:壓力測試報告》
>> 更多同類文章 ……
[10] 有關推送技術的文章:
《iOS的推送服務APNs詳解:設計思路、技術原理及缺陷等》
《Android端消息推送總結:實現原理、心跳保活、遇到的問題等》
《掃盲貼:認識MQTT通訊協議》
《一個基於MQTT通訊協議的完整Android推送Demo》
《求教android消息推送:GCM、XMPP、MQTT三種方案的優劣》
《移動端實時消息推送技術淺析》
《掃盲貼:淺談iOS和Android後臺實時消息推送的原理和區別》
《絕對乾貨:基於Netty實現海量接入的推送服務技術要點》
《移動端IM實踐:谷歌消息推送服務(GCM)研究(來自微信)》
《爲什麼微信、QQ這樣的IM工具不使用GCM服務推送消息?》
>> 更多同類文章 ……
[11] 更多即時通信技術文章分類:
http://www.52im.net/forum.php?mod=collection&op=all