请选择 进入手机版 | 继续访问电脑版

默认
打赏 发表评论 2
WhatsApp技术实践分享:32人工程团队创造的技术神话

1、前言


484365f3153ace2ad3af9849ac011728.jpg

国外非常流行的移动端IM应用WhatsApp(地位相当于国内的微信),几年前以190亿美元的价格出售给了Facebook,对于WhatsApp而言这是一场辉煌的胜利。

然而不可忽视的是,该公司当时服务于4.5亿活跃用户的工程师团队只有区区32人。我们再次回顾了当时HighScalability创始人Tod Hoff撰文分析的收购原因和WhatsApp的高可靠架构,内容虽然并不完整,以今天的眼前来看成,仍有有许多值得学习的地方。

2、WhatsApp是什么?


WhatsApp(WhatsApp Messenger)是一款国外流行的移动端IM软件(相当于国内的微信),用于智能手机之间的通讯。本应用程序借助推送通知服务,可以即刻接收亲友和同事发送的信息。可免费从发送手机短信转为使用WhatsApp程序,以发送和接收信息、图片、音频文件和视频信息。

WhatsApp大事记:

  • 2009年2月24日,寇姆注册了一家专门开发手机“状态”应用的公司。公司暂定名称为WhatsApp另一个备选名称是Zap,其目的是开发一款能够表明机主是否方便接电话的应用。
  • 2009年5月,该产品的第一个版本没有引发任何反响。6月后,苹果公司在iOS 3.0中增加了通知推送功能。让寇姆开始重新思考WhatsApp的功能,希望将它重新定位成一款功能齐全的跨平台聊天应用,不仅可以直接将手机通讯录作为“预先搭建的社交网络”,还能直接用手机号码登录。9月,该应用上线,艾克敦决定与寇姆一起创业,还领导了一轮投资。他们希望共同探索一种独特的商业模式,既能创造足够的营收,又可以确保在可控范围内实现增长,从而提供充足的基础设施。
  • 2011年8月28日,寇姆团队宣布该应用拒绝刊登广告。同年红杉资本创始合伙人吉姆·吉茨(Jim Goetz)斥资800万美元入股WhatsApp。
  • 2013年6月12日,移动聊天工具WhatsApp每日处理的聊天信息数量达到了270亿条。
  • 2014年2月20日,移动通信服务(IM软件)WhatsApp将被社交网络Facebook以大约190亿美元的价格收购。 10月3日,欧盟反垄断监管机构正式批准了Facebook收购移动消息初创公司WhatsApp的交易。 [9]
  • 2015年4月21日,WhatsApp iOS版进行了更新,新增了语音通话功能,跨应用分享视频、图片和链接功能,应用内拍摄分享图片功能,一次性分享多张照片和视频功能。

3、WhatsApp 190亿美元出售的背后


做为一个程序员,如果你问WhatsApp是否值那么多,我的答案必然是否定的!因为产品真正价值不在于那些死板的代码,而在如何让用户喜欢并且使用。

着眼这个应用的特点,我们知道WhatsApp是一个世界级的 零噱头(零广告,零创意,零游戏)产品,在SMS收费时代提供了一个免费的信息交互平台。当下,这个应用已被数量巨大的美国人使用,因此一旦有用户加入,即会在上面发现大量的亲朋好友。在手机如此普及年代,WhatsApp绝对称得上填补了美国社交网络上的空白。鉴于其跨平台特性,所以每个人都可以使用它;值得关注的是,它还可以传递各种格式信息,比如共享地理位置、发送语音及视频等。WhatsApp有着非常出色的国际化,使用手机号码作为验证信息、联系人列表作为社交图,因此你不需要邮箱验证、用户名及密码,更不需要提供信用卡等号码信息——“it just works”。

虽然WhatsApp有着如此的诱人特性,但是它仍然不值190亿美元,而且对于互联网巨头来说,这样的特性模仿起来也并不复杂。

WhatsApp之所以能卖190亿美元可能有多个原因:

  • 第1:WhatsApp已经威胁到Facebook;
  • 第2:当时的Facebook正在褪色,需要补充大量新鲜血液;
  • 第3:WhatsApp是你的电话簿;
  • 第4:WhatsApp可以收集到大量的元数据(虽然他们并未保存)。

准确的说,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补丁。

  • 4.5亿的活跃用户,并且是史上最快达到这个数字的公司;
  • 32个工程师,平均每人支撑1400万活跃用户;
  • 每天收发跨7个平台的500亿消息;
  • 平均每天注册用户过百万;
  • 0广告开销;
  • 800万投资;
  • 数百个节点;
  • 8000+核心;
  • 数百TB内存;
  • 每秒Erlang消息超过7000万。

在2011年,WhatsApp单服务器取得 100万个tcp会话,同时还有内存和CPU剩余。在2012年, tcp会话发展到了200万。2013年WhatsApp 发表tweet声明,70亿消息入站,110亿消息出战,即每天处理180亿消息,伟大的2013!

5、WhatsApp所依赖的基础软件技术


服务端包括:

  • Erlang;
  • FreeBSD;
  • Yaws、lighttpd;
  • PHP;
  • BEAM定制补丁(BEAM类似于Java的JVM,但适用于Erlang);
  • 定制XMPP。

客户端包括:
7个客户端平台:iPhone、Android、Blackberry、Nokia Symbian 360、Nokia S40、Windows Phone。

6、WhatsApp所依赖的硬件平台


标准的面向用户服务器:

  • Dual Westmere Hex-core(24个逻辑CPU);
  • 100 GB RAM、SSD;
  • Dual NIC(公共面向用户的网络、私有的后端 /分布)。

7、WhatsApp产品的定义


  • 聚焦消息传递:连接来自世界各地的用户,忽视他们的地理位置,无需支付高额费用,创始人Jan Koum还经常提起1992年在世界各地与家里人联系是多么的难。
  • 隐私:由Jan Koum制定,消息不会在服务器上储存,聊天记录也不会储存,目的就是不去了解用户隐私。不会保存用户姓名及性别,聊天记录只存储在电话上。

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:

  • Dtrace是主要用于调试,而不是提高性能。
  • 在FreeBSD上给BEAM打补丁加入CPU时间戳。
  • 写脚本创建所有进程的聚合视图,查看哪些程序一直在占用系统资源。
  • 最大的胜利是给模拟器启用锁计数。

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架构方面的技术文章


[6] 有关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)[附件下载]
>> 更多同类文章 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token下一篇:openfire集群配置host的原因是什么?

本帖已收录至以下技术专辑

推荐方案
评论 2
那个开源的Tigase是不是Whatsapp开源出来的IM系统?
签名: 找到了个好地方,干货真多
要说功能,WhatsApp跟国内的微信比,确实不是一个级别,WhatsApp的定位很明确,就是个纯IM,而微信这样的产品定位是一个平台,巴不得将所有移动互联网入口都攥在手上。

所以你在用WhatsApp的时候会觉得老外做的这什么玩意,就这么点功能,但其实IM不就应是这样吗。

1.jpg    2.jpg

我之前要国外的时候用过WhatsApp,用过你会发现,这什么破玩意就这么点功能,原因是功能太少不足以打发无聊的时间。
所以反过头来再看看手机qq和微信,以前抱怨它们怎么这么重、这么多功能,真到了没有这些功能的时候,确实是不习惯,所以还是多一点好啊!
签名: 《脑残式网络编程入门(四):快速理解HTTP/2的服务器推送》http://www.52im.net/thread-1795-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部