1、前言
随着云IM的发展,已吸引越来越多有IM需求的APP接入。但考虑到云IM无论从商业模式还是运营模式上,还需经过多年的沉淀,才可能真正实现客户与服务商的运营和服务良性循环的双赢局面。在此之前,加上有些场景下(比如为了信息安全而不允许接入第3方云IM的应用、IM作为公司核心技术发展而不考虑用云的情况等)也确实不适合采用云IM,所以目前开发完全自主IM的需求和动力依然很旺盛。
但要想做好全功能、全平台的IM,没一定的技术积累,显然是很难驾驭的了。正如TeamTalk的服务端设计者所说“IM的开发,从功能抽象的角度看可能非常简单,可以认为是管理大量的客户端连接和在不同的客户端之间传递消息,但具体到实现细节就比较复杂了。打个不恰当的比喻,OS的功能抽象也非常简单,无非是进程间的调度和硬件资源的管理,但要是自己去实现一个,一般人也就只能呵呵了”。
有鉴于此,很多团队开发自主IM时,都会首先想到在开源IM的基础上修改后,作为已用。但话虽如此,靠谱的支持全平台的开源IM,少之又少,这其中,蘑菇街开源的TeamTalk勉强算是一个。但正如国内大多数的开源工程一样,对已无利的事,很少会有人真心坚持的下去。
本文将简要介绍TeamTalk开源的过去和现在,为打算研究和采用TeamTalk的同行提供一定程度的参考。文中所涉及内容如有不妥,还请各位看官见谅。
(本文同步发布于:http://www.52im.net/thread-447-1-1.html)
2、即时通讯技术交流
- 即时通讯开发交流群: 215891622 [推荐]
- 更多即时通讯技术资料:http://www.52im.net/forum.php?mod=collection&op=all
3、TeamTalk相关资源
官方网站: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月前)
4、版权纠纷:源码存在版权纠纷,使用有风险
4.1 到底发生了什么?
源码被Github下架后TeamTalk的网站给出的申明,截图如下:
4.2 来自官方的访谈和回应
作为蘑菇街官方对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的优点主要有以下几点:
- 开源:开源意味着免费和自定义开发,从客户端端到后端,每一部分都开源,社区的力量能够帮助它走得更快更好,也能够帮助一些企业和开发者快速搭建自己的IM应用和服务。
- 跨平台:多平台客户端支持,PC下的Windows和Web页面,移动化方面的Android和iOS都能够很好的支持,符合当前应用全端的趋势。
- 高安全性:通过对协议和数据的抽象分层设计,支持自定义协议传输和数据包加解密处理,支持消息阅后即焚功能,支持数据自定义加解密存储。
- 弹性伸缩:通过对后端服务的高度分层和应用功能单一化处理,隔离消息通信处理和消息业务处理,使得运维成本,硬件成本降到最低,保证弹性伸缩。
- 高可用行:通过LoginService的排队机制和负载策略,MsgSerivce/BizService的多实例配置,RouterService的调度和集群管理避免单点,保证了系统的高可用性。
TeamTalk的不足还是很明显的,存在以下几点:
- 缺人:团队在软件开源管理方面经验比较少,缺少社区开源这块经验丰富的运作人员,也缺少能够贡献代码的开发者。
- 功能不够完善:TeamTalk作为全新的IM开源软件,目前只具备了语音、文本、表情、传图等基础IM业务功能,功能还不够强大,框架层面,我们也只是做了比较基础的部分。
- 文档和注释不够规范:之前开发得比较急,很多代码的注释不够详尽,文档也比较粗糙。
Q:TeamTalk是如何保证消息的安全性以及可靠性的?
A:刚说到TeamTalk优点的时候也提到了安全性,我们通过对消息数据的在系统中6个生命周期:数据录入、数据封包、数据传输、数据解包、数据存储、数据展现进行了细致划分,从协议和数据两个维度出发做了高度抽象分层设计,采用了自定义协议和自定义数据封解包处理。
为了节省网络流量,TeamTalk的协议是建立在TCP上的自定义二进制协议,TCP协议栈保证了数据的可靠传输。但是由于移动设备的网络不是很稳定,经常会出现一些连接超时断开的问题,我们对消息的传输又做了应用层方面的Ack机制,这样当客户端没有收到服务器的Ack,会提醒用户消息发送失败。以后还会考虑加入send-wait这种机制来确保消息的可靠传输,即在发送下一条消息前,已经确保收到了前一条消息的Ack。同时考虑到有些内网只支持HTTP穿透,我们后继会考虑支持HTTP长轮询接入,蘑菇街线上的服务器已经支持这两种模式。
Q:TeamTalk未来的发展计划是什么?会增加哪些新功能?是否会搭建云IM服务器为大家所用?会推出付费服务么?
A:从长远角度,我们的目标是希望TeamTalk能够成为企业和开发者搭建自己IM的首选软件,这个是理想。回到现实的话,半年之内,我们希望能够完成以下几个里程碑:
- 社区:有一个相对稳定活跃的社区,有一帮志同道合热爱IM热爱开源的小伙伴很重要。
- 文档:GitHub上的文档和注释能够相对规范完善。
- 服务:对外提供公有云服务,切实的帮助中小企业和开发者快速以最小时间最小人力成本搭建自己的全端IM服务。
对于TeamTalk的新功能,由于TeamTalk支持插件式功能开发,所以我认为在开源的背景下,这个不是第一要位的事情,我想每个开发者都会很想给自己的女神开发一个摇一摇插件,发挥大家的能动性就好。TeamTalk付费服务暂时不在我们考虑中。
Q:11月4日,TeamTalk相关的仓库都已经被GitHub禁用,GitHub官方解释是TeamTalk的架构、通讯协议以及部分代码都有抄袭网易POPO之嫌。能解释下这件事情么?目前准备怎么处理?
A:TeamTalk做出开源决定的初衷,是因为我们在创业初期也使用了很多优秀的开源软件,所以想把一些优秀的软件也回馈给开源社区。4号11点多我们突然发现被下架的情况,之后收到GitHub的下架通知,大家也非常重视,毕竟TT凝聚了工程师们的大量心血。但恰逢双十一,而且这个双十一是蘑菇街上线自己的电商交易平台以来的第一个双十一,我们主营业务的开发压力非常大,为了尽快排查TT被下架的细节情况,澄清事实,解决问题,我们已经安排了专人在仔细地检查代码,并和GitHub以及POPO团队进行积极的沟通。但从现在的情形看来,还需要多一点时间。
我们已经向GitHub提出了申诉,同时,如果排查的结果确实存在版权问题,我们会做出公开道歉并制定惩戒方案。
5、源码割裂:混乱的源码管理
5.1、2015年5月前的TeamTalk
笔者清楚的记得,TeamTalk开源之初的github托管地址是:https://github.com/mogutt,源码和文档都是很齐全的,比如下面的截图:
文档和说明还算齐全,你还能在Github上找到当初的fork版本,比如下面这个:https://github.com/lizj3624/https-github.com-mogutt-TTServer
5.2、2015年5月后的TeamTalk
现在的TeamTalk托管在Github上的地址是:https://github.com/mogujie/TeamTalk,大致翻了下,源码和文档跟当初https://github.com/mogutt相比,源码先不说,至少文档上来看,比原先要简陋了很多:
5.3、此源码可能已非彼源码!
鉴于发布之初与网易泡泡的源码存在很大的纠纷(说白了很可能是网易泡泡的离职人员直接使用了POPO的代码),2015年5月后的源码(就是现在的官方托管地址:https://github.com/mogujie/TeamTalk)可能已非当初的源码,具体能不能用,还有多少借鉴价值,就不得而之了。
6、管理之争:TeamTalk开源管理者的离去
原先的管理者“蓝狐”于2015年7月31日发布的博文(地址是:http://www.bluefoxah.org/teamtalk/another_tt_roadmap.html)中称:
自从离开蘑菇街之后,蘑菇街收回了我的github代码提交权限,这让我非常诧异,TeamTalk是一款开源的产品,为什么所有的控制权一定要把控在某个公司手里?我心里知道这是谁的主意,也可以想象出来当时的场景。不过后面还是冷静下来思考良久。也许是他们担心TeamTalk的“荣誉”被我给“占领”了。我想说的是,既然是开源产品,就该本着*,开放,共享,贡献,合作的精神来把TeamTalk发展起来,而不是在背后瞎BB。
虽然由于个人原因,离开了蘑菇街,但是一直关注着TT的发展,也一直努力去维护TT群的氛围,期间也在提交代码,但是却不明白“官方”为什么要收回我提交,审核代码的权限。
以上文字不多,但作为技术同行的你,应该能想见TeamTalk这背后的“人”和“事”了,各位自行猜测吧。
7、没有未来:已1年无更新的TeamTalk谈何未来
先不说现在的TeamTalk源码(地址是:https://github.com/mogujie/TeamTalk)跟发布之初的代码有多少渊源(当初涉及网易POPO的源码去哪了?),官方的Github仓库显示至少已超过11个月无人去管了:
8、即时通讯开发资料分享
[1] 网络编程基础资料:
《TCP/IP详解 - 第11章·UDP:用户数据报协议》
《TCP/IP详解 - 第17章·TCP:传输控制协议》
《理论经典:TCP协议的3次握手与4次挥手过程详解》
《计算机网络通讯协议关系图(中文珍藏版)》
《NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等》
《UDP中一个包的大小最大能多大?》
《Java新一代网络编程模型AIO原理及Linux系统AIO介绍》
《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》
《NIO框架入门(四):Android与MINA2、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.264、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