1、前言
国外非常流行的移动端IM应用WhatsApp(地位相当于国内的微信),几年前以190亿美元的价格出售给了Facebook,对于WhatsApp而言这是一场辉煌的胜利。
然而不可忽视的是,该公司当时服务于4.5亿活跃用户的工程师团队只有区区32人。我们再次回顾了当时HighScalability创始人Tod Hoff撰文分析的收购原因和WhatsApp的高可靠架构,内容虽然并不完整,以今天的眼前来看成,仍有有许多值得学习的地方。
2、WhatsApp是什么?
WhatsApp(WhatsApp Messenger)是一款国外流行的移动端IM软件(相当于国内的微信),用于智能手机之间的通讯。本应用程序借助推送通知服务,可以即刻接收亲友和同事发送的信息。可免费从发送手机短信转为使用WhatsApp程序,以发送和接收信息、图片、音频文件和视频信息。
WhatsApp大事记:
3、WhatsApp 190亿美元出售的背后
做为一个程序员,如果你问WhatsApp是否值那么多,我的答案必然是否定的!因为产品真正价值不在于那些死板的代码,而在如何让用户喜欢并且使用。
着眼这个应用的特点,我们知道WhatsApp是一个世界级的 零噱头(零广告,零创意,零游戏)产品,在SMS收费时代提供了一个免费的信息交互平台。当下,这个应用已被数量巨大的美国人使用,因此一旦有用户加入,即会在上面发现大量的亲朋好友。在手机如此普及年代,WhatsApp绝对称得上填补了美国社交网络上的空白。鉴于其跨平台特性,所以每个人都可以使用它;值得关注的是,它还可以传递各种格式信息,比如共享地理位置、发送语音及视频等。WhatsApp有着非常出色的国际化,使用手机号码作为验证信息、联系人列表作为社交图,因此你不需要邮箱验证、用户名及密码,更不需要提供信用卡等号码信息——“it just works”。
虽然WhatsApp有着如此的诱人特性,但是它仍然不值190亿美元,而且对于互联网巨头来说,这样的特性模仿起来也并不复杂。
WhatsApp之所以能卖190亿美元可能有多个原因:
准确的说,190亿美元收购WhatsApp是为了它的海量用户,为了它日增数百万的用户,为了它可能会有10亿用户的潜能——Facebook需要WhatsApp成为下一个10亿用户应用,当然只能成为它的一部分。同时,40美元一个用户的价格也并不离谱,特别是以股票充当大部分金额。Facebook曾今使用 30美元每用户的价格收购了Instagram,而 Twitter的每个用户更值110美元。
Benedict Evans 做了一个非常棒的预测,移动是一个万亿级的市场。WhatsApp通过每天发送180亿SMS消息(整个SMS系统每天发送的消息也只有200亿条)搅乱了整个SMS市场,而这个市场有着超过1亿美元的税收。在智能手机采用越发普及的年代,WhasApp有着比Facebook更清晰的盈利思路。然而,在承诺了零广告和零干涉后,Facebook又会从何处得益?
在 移动应用业务开发上有着许多有趣的用例, WhatsApp则经常被项目团队用来建立会话组,风投们也乐于将它作为交易流程中的对话工具。
鉴于每个人都有手机而且消息应用已变得更加强大、自由及便宜,商业及其它类型应用程序已逐步向移动端过渡。许多功能已不再只能用桌面或Web应用程序实现,称动端IM应用的重要性已无需争议。
不过,抛开这次交易不谈,WhatsApp究竟是如何用32个工程师来支撑当时4.5亿的活跃用户?下面我们一起来看看。
4、WhatsApp当时给出的统计数据
这些统计是当时系统的一些数据,更多针对数据存储、消息、meta-clustering以及新加入的BEAM/OTP补丁。
在2011年,WhatsApp单服务器取得 100万个tcp会话,同时还有内存和CPU剩余。在2012年, tcp会话发展到了200万。2013年WhatsApp 发表tweet声明,70亿消息入站,110亿消息出战,即每天处理180亿消息,伟大的2013!
5、WhatsApp所依赖的基础软件技术
服务端包括:
客户端包括:
7个客户端平台:iPhone、Android、Blackberry、Nokia Symbian 360、Nokia S40、Windows Phone。
6、WhatsApp所依赖的硬件平台
标准的面向用户服务器:
7、WhatsApp产品的定义
8、WhatsApp的具体技术情况
1. WhatsApp服务器基本上完全使用Erlang实现
做后端消息路由的服务器系统使用Erlang实现值得炫耀的是,如此庞大数量的活跃用户只使用非常少的服务器来管理,团队一致认为这很大程度上归功于Erlang。值得注意的是,Facebook Chat就是在2009年使用Erlang开发,他们弃用Erlang的原因是难以招聘到优秀的程序员。
2. WhatsApp服务器最早从Ejabberd开始
Ejabberd是个非常出名的开源Jabber服务器,使用Erlang实现。最初选用它的原因是开放、广受开发者关注、易于开始以及Erlang在大型通信系统上的长期口碑。接下来的许多年一直从事Ejabberd的重写和修改,包括从XMPP转换到内部开发协议、调整代码库以及重设计一些核心组件,对Erlang VM做了大量的修改以获得高性能。
3. 为了应对每天500亿消息,工作重心被放到可靠系统的打造上,货币化对于我们来说还是件遥远的事情。
4. 系统的健康状况主要看队列的长度,每个节点上消息队列的长度都会被一直监控,超过预先设置的临界值则会发出提醒,多个警报发生则标志着系统进入了下一个瓶颈。
5. 通过上传图片、音频、视频到一个HTTP服务器上来发送多媒体消息,然后将链接与Base64编码的缩略图一起添加到内容(如果可用)。
6. 有些代码基本上每天都在变化,通常情况下是一天几次;当然,峰值期间必须避开的。Erlang非常适用于将修改或者是新功能添加到产品,热加载意味着无需重新启动就可以实现修改,错误可以很快的得到解决,同样通过热加载,系统变得更加松耦合,这可以让更新快速的发布。
7. WhatsApp使用了什么样的协议?
WhatsApp服务器池使用了SSL Socket,在客户端重新连接对消息进行检索之前,所有消息都会在服务器上排队。消息的成功检索会发回给WhatsApp服务器,它将会被重新转发给原始发送者;一旦客户端成功接收这条消息,它就会在服务器存储中擦除。
8. WhatsApp注册程序的内部工作机制是什么样的?
WhasApp依赖电话IMEI号码来建立用户名/密码,这点在最近已经修改。WhatsApp现在会让应用发送一个包含5位数Pin的一般请求,然后给这个电话号码发送一个SMS,这意味着WhatsApp客户端不再受限于某台手机。基于Pin的号码,应用会从WhatsApp请求一个唯一的键,这个键将作为未来的使用密码,这同样意味着在新的设备上注册后会无效原有设备上的键。
9. 在Android上使用了Google的推送服务。
10. 在Android上的便利性。
与Android打交道更让大家愉快,开发者能够快速的基于一个特性构建原型,并以最短的时间推出,如果存在问题的话也可以快速修复,iOS则不行。
9、WhatsApp实现单服务器上200万连接数的探索
1)购买更好的硬件:
虽然用户增长是喜闻乐见的,但是它同样意味着你得投入更多钱去购买硬件;同时,机器数量的增加也大幅增加了管理和运维复杂性。
2)需要为流量的起伏做规划:
例子就是西班牙的足球比赛和墨西哥的地震。这些现实世界中发生的大事件造成了非常高的流量峰值,因此需要有足够的剩余容量来应对流量高峰+突发事件,比如一场近期的足球比赛产生了当天35%的出站消息。
3)初始的服务器负载是每个服务器20万并发连接:
预期将会添加大量的服务器来维持用户增加。服务器会因为负载的爆发而宕机,网络及其它的故障也会发生。这时候需要做一些组件的解耦,这样一来可以添加容量以应对峰值。目标是单服务器支撑百万连接数,这个目标在只有20万连接数时已经制定。动态的容量规划以应对世界级事件、硬件故障及其它类型的小故障,系统需要足够的弹性去应对高使用率和故障。
10、用来增强可扩展性的工具和技术
1. 编写系统活动报告工具(wsar):
记录整个系统状态,包括OS状态、硬件状态、BEAM状态。这是为了便于从其他系统获取状态信息,如虚拟内存。跟踪记录CPU利用率、系统整体利用率、用户时间、系统时间、中断时间、上下文切换、系统调用、traps、数据包发送和接收、所有进程队列中总消息数、繁忙的端口事件、通信速率、字节输入/输出、调度状态,垃圾回收状态等。
最初一分钟运行一次,当系统运行变得困难时,时间段将降为1秒钟一次,因为一分钟无法运行的情况很少发生。了解所有系统运行情况需要非常细粒度的统计数据。
2. CPU(pmcstat)中的硬件性能计数器:
通过查看CPU时间占用百分比,可以了解正在执行的模拟器(emulator)周期时间。假如是16%,说明只有16%的时间执行模拟代码,所以即使你能消除所有Erlang代码的执行时间,也只能节省总运行时间16%,这意味着你应该将重点放在其他方面以提高系统的效率。
3. dtrace、 内核锁计数、fprof:
4. 一些问题:
5. 度量:
假如在一台服务器只支持100万连接,那么整个系统将需要30台这样的主机去打开足够的IP端口,生成足够多的连接;然而,这么多的开销仅仅可以测试一台服务器。对于测试200万个连接的服务器需要用到60个主机,生成这样的规模真的很难。
很难生成生产环境下的那种流量。在正常的工作量下还可以估算,但在现实中看到的那些网络事件、世界事件,这主要因为多平台上客户端的不同用户行为,而且不同国家之间也有差异。
6. 结果:
开始时每个服务器有20万个并发连接。第一个瓶颈出现每台服务器42.5万个连接的时候。系统遇到了很多冲突,工作停止了。安装调度器检测有多少有用的任务被停止、睡眠,或回转了。在加载时,它开始遇到睡眠锁,整个系统只用35-45%的CPU利用率,但调度程序的CPU利用率却达到了95%。
第一轮修复使连接数超过100万个。VM利用率为76%,CPU利用率为73%,BEAM模拟器利用率为45%,与用户百分比很吻合,这是件好事,因为模拟器得和用户一样。通常CPU利用率并不是好的评估方法,因为可能由于调度程序使用CPU导致系统看起来很忙。
一个月以后解决了瓶颈,每个服务器连接数达到200万个。BEAM利用率为80%,与FreeBSD开始分页的情况接近。CPU利用率大致相同,有两倍的连接数。调度程序遇到了冲突,但运行得很好。看来测试可以暂停了,这时开始分析Erlang代码。
最初每个连接有两个Erlang进程,消减为一个。用计时器完成一些工作。
11、经验总结
1. 优化是件非常艰辛的事情,也只有工程师去做:
Rick在回顾大量的修改后(使每个服务器连接数达到200),更觉得头皮发麻。大量的工作包括编写工具、运行测试、增加补丁、把让人眼花缭乱的方法添加到堆栈的每一层、调试系统、寻找蛛丝马迹,每一个细节都不能放过,你需要努力让一切都在掌握之中。只有这样才能消除瓶颈,提高性能以及最大程度地实现可扩展性。
2. 获取你需要的数据、编写工具、为工具添加补丁、添加调控旋钮:
扩展系统获取更多数据是Ken不懈的追求,为了获取他们需要的数据,需要不停地编写工具、脚本来管理和优化系统。为了数据,不惜一切代价。
3. 度量、消除瓶颈、测试、不断重复这样的过程:
枯燥无聊,但你需要这样做。
4. Erlang很给力!
Erlang继续证明其作为一个多用途、可靠、高性能平台的优良品质。虽然Erlang也需要大量的调整和修补,这些工作难免会让人对Erlang产生质疑。
5. 破解病毒式代码,获得益处:
“病毒式”现在是优良品质的代名词,就像WhatsApp那样,只要你真得做到了,那意味着你得到了很多很多钱。
6. 价值和员工数现在已经没有直接联系了:
如今,员工的数量并不能说明什么。先进的世界级电信基础设施使WhatsApp这样的应用程序成为可能。如果WhatsApp还需要做网络或手机等设备,那可能根本就不会有WhatsApp这样的公司存在。功能强大、价格廉价的硬件和开源的软件也无疑使WhatsApp的成功事半功倍。换句话说WhatsApp的成功在于它在正确的地点、时间为正确的用户提供了正确的产品。
7. 能够重视用户想法是很了不起的:
WhatsApp 将自身定位成一个简单的消息传递应用,而不是游戏网络、广告网络或者已经面临消亡的照片网络,这一点很重要。这样的定位使他们没有在应用中添加广告,他们努力保持应用简单的同时添加新功能,傻瓜型操作方式使WhatsApp适用于每一个用户。
8. 考虑到简单性,有一些限制是允许的:
你的身份被绑定到电话号码,所以如果你更改了电话号码你的身份就失效了。这和一般的应用程序确实有点不太一样,但却使整个系统在设计上变得更加简单了。
9. 年龄上的歧视:
2009年,因为年龄歧视,WhatsApp创始人Brian Acton在Twitter和Facebook连一份工作都找不到,那就让它们后悔去吧。
10. 先从简单的开始然后再深度定制:
WhatsApp刚推出时,服务器端基于jabberd,现在它已经被完全重写,但那个确实是Erlang方向上的第一步。Erlang初次使用时就体现出的可扩展性、可靠性和可操作性,这使得到了越来越广泛的应用。
11. 保持低的服务器数量:
努力让服务器尽可能的少,同时为短暂高峰期预留足够的上升空间。分析并优化直到达到收益递减点,然后再部署更多的硬件。
12. 有目的地增加冗余服务器:
这可以确保在公司放假时也能为用户提供不间断的服务,员工可以享受假期而不用花时间修复过载问题。
13. 赚钱时也要考虑公司的成长:
WhatsApp免费时成长是最快的,早期每天都有1万次的下载量。然后转向付费时,下载量下降至每天1000次。在年底增加了图片消息后,他们就把按下载次数付费改成了按年收费。
14. 灵感总来自最意想不到的地方:
忘记Skype用户名和密码的经历无疑给WhatsApp带来了灵感。
附录:更多IM架构方面的技术文章
有关IM架构设计的文章:
《浅谈IM系统的架构设计》
《简述移动端IM开发的那些坑:架构设计、通信协议和客户端》
《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》
《一套原创分布式即时通讯(IM)系统理论架构方案》
《从零到卓越:京东客服即时通讯系统的技术架构演进历程》
《蘑菇街即时通讯/IM服务器开发之架构选择》
《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》
《微信后台基于时间序的海量数据冷热分级架构设计实践》
《微信技术总监谈架构:微信之道——大道至简(演讲全文)》
《如何解读《微信技术总监谈架构:微信之道——大道至简》》
《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》
《17年的实践:腾讯海量产品的技术方法论》
《移动端IM中大规模群消息的推送如何保证效率、实时性?》
《现代IM系统中聊天消息的同步和存储方案探讨》
《IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?》
《IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议》
《IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token》
《WhatsApp技术实践分享:32人工程团队创造的技术神话》
《QQ空间移动端10亿级视频播放技术优化揭秘(视频+PPT)
附件下载
《微服务理念在微信海量用户后台架构中的实践(视频+PPT)
附件下载
《移动端IM开发和构建中的技术难点实践分享(视频+PPT)
附件下载
《网易云信的高品质即时通讯技术实践之路(视频+PPT)
附件下载
《腾讯音视频实验室:直面音视频质量评估之痛(视频+PPT)
附件下载
《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT
附件下载
《微信朋友圈海量技术之道PPT
附件下载
《手机淘宝消息推送系统的架构与实践(音频+PPT)
附件下载
《Go语言构建高并发消息推送系统实践PPT(来自360公司)
附件下载
《网易IM云千万级并发消息处理能力的架构设计与实践PPT
附件下载
《手机QQ的海量用户移动化实践分享(视频+PPT)
附件下载
《钉钉——基于IM技术的新一代企业OA平台的技术挑战(视频+PPT)
附件下载
《微信技术总监谈架构:微信之道——大道至简(PPT讲稿)
附件下载
《微信海量用户背后的后台系统存储架构(视频+PPT)
附件下载
版权声明
本文仅代表作者观点,不代表xx立场。
本文系作者授权xx发表,未经许可,不得转载。
最新留言