微信,WhatsApp和其他Messenger应用程序的技术是什么?
我渴望了解不同的实时通讯应用程序的架构。 他们是否使用任何通用协议/架构?
Facebook以190亿美元的价格购买了WhatsApp架构解释了在devisewhatsapp时涉及到的架构。
这里是链接的一般解释
WhatsApp服务器几乎完全在Erlang中实现。
执行后端消息路由的服务器系统在Erlang中完成。
伟大的成就是活跃用户的数量是由一个非常小的服务器足迹来pipe理的。 团队的共识是,这主要是因为Erlang。
有意思的是,Facebook Chat是在2009年用Erlang编写的,但是他们远离了它,因为很难find合格的程序员。
WhatsApp服务器已经从ejabberd启动
Ejabberd是用Erlang编写的着名的开源Jabber服务器。
最初的select是因为它的开放性,开发人员的出色评价,易于启动以及Erlang长期适用于大型通信系统的承诺。
接下来的几年花费了很多时间重写和修改ejabberd的一些部分,包括从XMPP切换到内部开发的协议,重构代码库和重新devise一些核心组件,并对Erlang VM进行了大量重要的修改,以优化服务器性能。
每天要处理500亿条消息,重点是build立一个可靠的系统。 货币化是以后要看的东西,它在很远的路上。
系统健康状况的主要标准是消息队列的长度。 持续监视节点上所有进程的消息队列长度,如果累积超出预设阈值的积压,则会发出警报。 如果一个或多个进程落后于提醒,这就提供了指向下一个攻击瓶颈的指针。
通过上载要发送到HTTP服务器的图像,audio或video,然后发送链接到内容以及Base64编码缩略图(如果适用),发送多媒体消息。
一些代码通常是每天推送的。 通常情况下,这是一天多次,但总体上避免了高峰时间。 Erlang有助于将修复和function投入生产。 热载意味着更新可以被推送而无需重新启动或stream量转移。 通常可以通过热装迅速撤消错误。 系统往往更松散耦合,这使得增量更换非常容易。
Whatsapp应用程序使用什么协议? 到WhatsApp服务器池的SSL套接字。 所有消息都在服务器上排队,直到客户端重新连接以检索消息。 成功检索一条消息被发回到whatsapp服务器,该服务器将这个状态转发回原始的发送者(这将看到消息旁边的“复选标记”图标)。 一旦客户端接收到消息,消息将从服务器内存中擦除
WhatsApp的内部注册过程如何工作? WhatsApp用于根据手机IMEI号码创build用户名/密码。 这是最近改变了。 WhatsApp现在使用从应用程序的一般要求发送一个唯一的5位数字的PIN。 WhatsApp将发送一个短信到指定的电话号码(这意味着WhatsApp客户端不再需要在同一个电话上运行)。 根据PIN码,应用程序将从WhatsApp请求唯一的密钥。 这个密钥用作所有未来呼叫的“密码”。 (这个“永久”密钥存储在设备上)。 这也意味着注册新设备将使旧设备上的密钥无效。
据我所知,Ejabberd( http://www.ejabberd.im/ )是父母,这是XMPP服务器,它提供了相当不错的开源function,Whatsapp使用了这个修改版本,Facebook消息传递也使用了修改版本这个。 一些更多的聊天应用程序喜欢三星的ChatOn,Nimbuzz messenger都使用ejabberd为基础的和Erlang的解决scheme也有这个ejabberd的修改版本,他们声称是高度可扩展性和testing更多的性能改进,并更名为MongooseIM。
Ejabberd是与其他大多数function实现的服务器。 由于它是在Erlang中构build的,因此它可以水平扩展。
WhatsApp已经select了Erlang,这是一种为编写可伸缩应用程序而devise的语言,可以承受错误。 Erlang使用称为Actor模型的抽象概念来实现并发 – http://en.wikipedia.org/wiki/Actor_(programming_language)与其他更传统的共享内存方法不同,angular色之间通过发送消息进行通信。; 与线程不同的行为者被devise为轻量级的。 参与者可以在同一台机器上,也可以在不同的机器上,消息传递抽象可以同时工作。 WhatsApp的一个简单实现可能是:每个用户/设备都被表示为一个actor。 这个actor负责处理用户的收件箱,如何将其序列化到磁盘,用户发送的消息以及用户收到的消息。 假设Alice和Bob是WhatsApp上的朋友。 所以有一个爱丽丝演员和一个鲍勃演员。
让我们追溯一系列来回stream动的消息:
Alice决定给Bob发消息。 Alice的手机build立了与WhatsApp服务器的连接,并且确定这个连接肯定来自Alice的手机。 爱丽丝现在通过TCP发送以下消息:“对于鲍勃:一个巨大的怪物攻击金门大桥”。 WhatsApp前端服务器之一反序列化此消息,并将此消息传递给名为Alice的angular色。
爱丽丝演员决定序列化并存储在一个名为“Alice's Sent Messages”的文件中,存储在一个复制的文件系统中,以防止由于不可预测的怪物横冲直撞造成的数据丢失。 演员艾丽丝决定通过传递消息“爱丽丝的消息1:一个巨大的怪物攻击金门大桥”,将这个消息转发给演员鲍勃。 爱丽丝演员可以以指数退避的方式重试,直到演员的鲍勃确认接收到该消息。
鲍勃演员最终收到(2)的消息,并决定将此消息存储在一个名为“鲍勃的收件箱”的文件。 一旦它永久地存储了这个消息,那么演员将通过向演员发送其自己的消息“我收到消息1”来接收消息。 爱丽丝演员现在可以停止它的重试努力。 鲍勃演员然后检查,看看鲍勃的手机是否有连接到服务器的活动。 它的确如此,Bob就是通过TCP将这个消息传递给设备的。
鲍勃看到这个消息,并回答“对于爱丽丝:让我们创造巨大的机器人打他们”。 鲍勃现在接受鲍勃的演员,如步骤1所述。鲍勃演员然后重复步骤2和3,以确保爱丽丝最终收到的想法,将拯救人类。
WhatsApp实际上使用XMPP协议,而不是我上面概述的那种优越的协议,但是你明白了。
我读了关于:可扩展消息和呈现协议(XMPP); 二郎;
参考: http : //www.erlang-factory.com/upload/presentations/558/efsf2012-whatsapp-scaling.pdf