【编者按】以190亿美元的价格出售给Facebook,交易谈判过程中更受到了拉里·佩奇的劝阻,WhatsApp确实取得了一场辉煌的胜利。然而不可忽视的是,该公司用以服务4.5亿活跃用户的工程团队只有区区32人。近日HighScalability创始人Tod Hoff撰文分析了这一天价收购的原因和WhatsApp的高可靠架构,虽然并不完整,但还是有许多值得学习的地方。
以下为译文:
从WhatsApp软件架构师Rick Reed在3月份即将发表的演讲介绍中(That's 'Billion' with a 'B': Scaling to the next level at WhatsApp),我们可以得知WhatsApp当下的一些轮廓:
现在,WhatsApp有数百个节点、数千个核心及数百TB的内存,我们的目标是服务全世界数十亿用户。在WhatsApp,我们使用了Erlang/基于FreeBSD服务器基础设施,为了应对消息的增长需求,我们必须克服一个又一个挑战,可以说在系统容量(大于8000核心)和速度(每秒Erlang消息超7000万)上的极限挑战从未停歇!
鉴于这个演讲在3月份才发布,这里我们不妨聚焦Rick Reed两年前的分享—— WhatsApp如何应对数百万的同时链接数。
在Yahoo!供职时,Rick Reed曾负责用C++建立高性能的消息总线,因此他对高扩展性架构并不陌生。WhatsApp创始人中还包括了一个拥有大量扩展经验的Yahoo!工程师,不难得知,WhatsApp有现在的成就与两个创始人的超凡技术是分不开的。而企图成为全世界50亿手机服务商的远大目标,他们也必须将技术推向极限!
做为一个程序员,如果你问WhatsApp是否值那么多,我的答案必然是否定的!因为产品真正价值不在于那些死板的代码,而在如何让用户喜欢并且使用。
着眼这个应用的特点,我们知道WhatsApp是一个世界级的 零噱头(零广告,零创意,零游戏)产品,在SMS收费时代提供了一个免费的信息交互平台。当下,这个应用已被数量巨大的美国人使用,因此一旦有用户加入,即会在上面发现大量的亲朋好友。在手机如此普及年代,WhatsApp绝对称得上填补了美国社交网络上的空白。鉴于其跨平台特性,所以每个人都可以使用它;值得关注的是,它还可以传递各种格式信息,比如共享地理位置、发送语音及视频等。WhatsApp有着非常出色的国际化,使用手机号码作为验证信息、联系人列表作为社交图,因此你不需要邮箱验证、用户名及密码,更不需要提供信用卡等号码信息——“it just works”。
虽然WhatsApp有着如此的诱人特性,但是它仍然不值190亿美元,而且对于互联网巨头来说,这样的特性模仿起来也并不复杂。
WhatsApp之所以能卖190亿美元可能有多个原因: 第1, 如Google CEO Larry Page所说;第2,WhatsApp已经威胁到Facebook;第3,Facebook正在褪色,需要补充大量新鲜血液;第4,WhatsApp是你的电话簿;第5,WhatsApp可以收集到大量的元数据(虽然他们并未保存)。
准确的说,190亿美元收购WhatsApp是为了它的 4.5亿用户,为了它的日百万用户增加,为了它可能会有10亿用户的潜能——Facebook需要WhatsApp成为下一个10亿用户应用,当然只能成为它的一部分。同时,40美元一个用户的价格也并不离谱,特别是以股票充当大部分金额。Facebook曾今使用30美元每用户的价格收购了Instagram,而 Twitter的每个用户更值110美元。
Benedict Evans 做了一个非常棒的预测,移动是一个万亿级的市场。WhatsApp通过每天发送180亿SMS消息(整个SMS系统每天发送的消息也只有200亿条)搅乱了整个SMS市场,而这个市场有着超过1亿美元的税收。在智能手机采用越发普及的年代,WhasApp有着比Facebook更清晰的盈利思路。然而,在承诺了零广告和零干涉后,Facebook又会从何处得益?
在 移动应用业务开发上有着许多有趣的用例, WhatsApp则经常被项目团队用来建立会话组,风投们也乐于将它作为交易流程中的对话工具。
Instagram被Kuwait用来出售绵羊。
WeChat,WhatsApp的一个竞争者,在1月份推出了一个叫车服务;值得关注的是,仅仅一个月,这个应用上的 打车成交量就达到了2100万。
商业活动看起来确实很适合WhatsApp,但是它的用途显然还有更多——西班牙警察使用它来抓捕罪犯,意大利人们使用它来组织篮球比赛。
鉴于每个人都有手机而且消息应用已变得更加强大、自由及便宜,商业及其它类型应用程序已逐步向移动端过渡。许多功能已不再只能用桌面或Web应用程序实现,消息应用已初露锋芒。
其中,许多应用已经对Facebook和Google产生威胁,桌面和网络皆将成为过去, 消息+移动将让整个系统愈加偏离这些巨头的王国,那么在这股移动的大潮中Facebook又该何去何从?
随着移动化的更加深入,Facebook的地位已愈发岌岌可危,用户的流逝显然已不可避免。桌面Web是Facebook后端所有特性的入口,它非常的肥胖、复杂及陈旧,当下已经很少有人会喜欢Facebook的UI。
在Facebook确定了“Mobile first”这个移动方案后,更深度的打磨被执行——不仅建立不同用途的应用,同时也提供了多个具有类似功能和相互竞争的应用,这些应用有时甚至不会共享相同的后台基础设施,比如:Messenger和WhatsApp,Instagram和Facebook图片应用。Paper也是Facebook一个限制功能候补入口,但是它表现得非常好。
在Mobile World Congress上,Facebook CEO Mark Zuckerberg发表了自己的看法, 他认为收购WhatsApp与Internet.org的愿景紧密相连:
这个思想就是建立一组基础互联网的免费服务——“互联网的911”,这可能是类似Facebook这样的社交网络服务、消息服务以及搜索服务等。将这些服务提供给那些支付得起却没有支付意识的用户,引诱其上瘾,让他们知道自己的重要性,从而更愿意使用更多的收费服务。
这是个长久的目标,这个舞台里有足够多的利益去追逐,然而即时回报率却非常的低, Facebook正在这条道路上前行着
抛开这次交易不谈,WhatsApp究竟是如何用32个工程师来支撑4.5亿的活跃用户,下面一起探索……
需要注意的是, WhatsApp的整体架构并未公开,这里仅仅是从不同信息源中获取不同的片段。Rick Reed的讲座主要分享了使用Erlang实现单服务器200万连接数,虽然很有价值,但是并不是整个应用架构。
这些统计是当下系统的一些数据,更多针对数据存储、消息、meta-clustering以及新加入的BEAM/OTP补丁。
后端
前端
三、 硬件
标准的面向用户服务器:
四、 产品
五、通用
1. WhatsApp服务器基本上完全使用Erlang实现
2. WhatsApp服务器最早从Ejabberd开始
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则不行。
六、单服务器上200万连接数的探索
1. 虽然用户增长是喜闻乐见的,但是它同样意味着你得投入更多钱去购买硬件;同时,机器数量的增加也大幅增加了管理和运维复杂性。
2. 需要为流量的起伏做规划,例子就是西班牙的足球比赛和墨西哥的地震。这些现实世界中发生的大事件造成了非常高的流量峰值,因此需要有足够的剩余容量来应对流量高峰+突发事件,比如一场近期的足球比赛产生了当天35%的出站消息。
3. 初始的服务器负载是每个服务器20万并发连接。
七、用来增强可扩展性的工具和技术
1. 编写系统活动报告工具(wsar):
2. CPU(pmcstat)中的硬件性能计数器:
通过查看CPU时间占用百分比,可以了解正在执行的模拟器(emulator)周期时间。假如是16%,说明只有16%的时间执行模拟代码,所以即使你能消除所有Erlang代码的执行时间,也只能节省总运行时间16%,这意味着你应该将重点放在其他方面以提高系统的效率。
3. dtrace、 内核锁计数、fprof
4. 一些问题:
5. 度量
6. 结果
7. 一些发现:
八、经验总结
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. 先从简单的开始然后再深度定制。聊天刚推出时,服务器端基于jabberd,现在它已经被完全重写,但那个确实是Erlang方向上的第一步。Erlang初次使用时就体现出的可扩展性、可靠性和可操作性,这使得到了越来越广泛的应用。
11. 保持低的服务器数量。努力让服务器尽可能的少,同时为短暂高峰期预留足够的上升空间。分析并优化直到达到收益递减点,然后再部署更多的硬件。
12. 有目的地增加冗余服务器。这可以确保在公司放假时也能为用户提供不间断的服务,员工可以享受假期而不用花时间修复过载问题。
13. 赚钱时也要考虑公司的成长。WhatsApp免费时成长是最快的,早期每天都有1万次的下载量。然后转向付费时,下载量下降至每天1000次。在年底增加了图片消息后,他们就把按下载次数付费改成了按年收费。
14. 灵感总来自最意想不到的地方。忘记Skype用户名和密码的经历无疑给WhatsApp带来了灵感。
原文连接: The WhatsApp Architecture Facebook Bought For $19 Billion