微信,whatsapp和其他Messenger应用程序背后的技术是什么?[关闭]


68

我渴望了解不同的实时Messenger应用程序的体系结构。他们使用任何通用协议/体系结构吗?


我听说过:可扩展消息和状态协议(XMPP);二郎 编号:erlang-factory.com/upload/presentations/558/...
阿德米尔何塞

Answers:


85

Facebook以190亿美元收购的WhatsApp体系结构解释了WhatsApp设计涉及的体系结构。

这是链接的一般说明

  • WhatsApp服务器几乎完全在Erlang中实现。

  • 执行后端消息路由的服务器系统是在Erlang中完成的。

  • 伟大的成就是,使用很小的服务器空间就可以管理活动用户的数量。团队的共识是,这很大程度上是因为Erlang。

  • 有趣的是,Facebook Chat是2009年用Erlang编写的,但由于很难找到合格的程序员,他们放弃了它。

  • WhatsApp服务器已从ejabberd启动

  • Ejabberd是用Erlang编写的著名的开源Jabber服务器。

  • 最初选择它是因为它的开放性,受到开发人员的好评,易于启动以及Erlang对于大型通信系统的长期适用性的承诺。

  • 接下来的几年用于重写和修改ejabberd的许多部分,包括从XMPP切换到内部开发的协议,重组代码库和重新设计一些核心组件,并对Erlang VM进行了大量重要修改以优化服务器性能。 。

  • 每天要处理500亿条消息,重点是制作一个可靠的有效系统。货币化是以后要研究的东西,它远未实现。

  • 系统运行状况的主要衡量指标是消息队列长度。节点上所有进程的消息队列长度将得到持续监控,如果它们积压的积压超过预设阈值,则会发出警报。如果一个或多个进程落后,则会发出警报,这将提供指向下一个攻击瓶颈的指针。

  • 通过将图像,音频或视频上传到HTTP服务器,然后将指向其内容的链接及其Base64编码的缩略图(如果适用)发送出去,来发送多媒体消息。

  • 通常每天都会推送一些代码。通常,一天要多次,但通常可以避免高峰时段。Erlang有助于积极地将修补程序和功能投入生产。热加载意味着可以推送更新而无需重启或流量转移。通常,再次通过热加载可以很快消除错误。系统趋向于松散耦合,这使得很容易以增量方式推出更改。

  • Whatsapp应用程序使用什么协议?WhatsApp服务器池的SSL套接字。所有消息都会在服务器上排队,直到客户端重新连接以检索消息为止。消息的成功检索将发送回whatsapp服务器,该服务器将该状态转发回原始发件人(它将在消息旁边显示为“复选标记”图标)。客户端接受邮件后,就会从服务器内存中清除邮件

  • 在Whatsapp中,注册过程如何在内部进行?WhatsApp曾经根据电话IMEI号码创建用户名/密码。最近更改了。WhatsApp现在使用应用程序的一般请求发送唯一的5位数PIN。然后,WhatsApp将SMS发送到指定的电话号码(这意味着WhatsApp客户端不再需要在同一部电话上运行)。然后,根据密码,应用程序会从WhatsApp请求唯一密钥。该密钥用作将来所有呼叫的“密码”。(此“永久”密钥存储在设备上)。这也意味着注册新设备将使旧设备上的密钥无效。


ejabberd是基于XMPP的。那MQTT呢,我听说FB信使使用了它
Manish Kumar

33

WhatsApp选择了Erlang语言,该语言是为编写可承受错误的可伸缩应用程序而构建的。Erlang的并发使用称为Actor模型的抽象-http: //en.wikipedia.org/wiki/Actor_(programming_language)角色不是通过更传统的共享内存方法,而是通过互相发送消息进行通信。与线程不同的Actor被设计为轻量级的。参与者可以在同一台机器上,也可以在不同的机器上,并且传递消息的抽象对于这两种都起作用。WhatsApp的简单实现可以是:每个用户/设备代表一个参与者。该参与者负责处理用户的收件箱,如何将其序列化到磁盘,用户发送的消息以及用户接收的消息。假设Alice和Bob是WhatsApp的朋友。因此,有一个爱丽丝演员和一个鲍勃演员。

让我们跟踪一系列来回流动的消息:

爱丽丝决定向鲍勃发消息。爱丽丝的电话建立了与WhatsApp服务器的连接,并且确定该连接肯定来自爱丽丝的电话。爱丽丝现在通过TCP发送以下消息:“致鲍勃:一个巨大的怪物正在攻击金门大桥”。WhatsApp前端服务器之一反序列化此消息,并将此消息传递给称为Alice的参与者。

演员Alice决定对其进行序列化,并将其存储在一个名为“ Alice's Sent Messages”的文件中,该文件存储在复制的文件系统上,以防止由于不可预测的怪物横冲直撞而导致数据丢失。然后,演员爱丽丝通过向其传递消息“爱丽丝的Msg1:一个巨大的怪物正在攻击金门大桥”,决定将该消息转发给演员鲍勃。演员Alice可以以指数退避重试,直到演员Bob确认收到消息为止。

演员鲍勃最终从(2)收到消息,并决定将此消息存储在名为“鲍勃的收件箱”的文件中。一旦持久存储了此消息,Bob演员就会通过向演员Alice发送一条自己的消息“我收到Msg1”来确认收到消息。演员爱丽丝现在可以停止重试。然后,演员Bob会检查Bob的电话是否与服务器建立了活动连接。它会这样做,因此演员Bob会通过TCP将消息流式传输到设备。

鲍勃(Bob)看到了此消息,并回复“致爱丽丝:让我们创造一个与之作战的巨型机器人”。演员鲍勃现在已按照步骤1中的说明对此进行了接收。演员鲍勃然后重复步骤2和3,以确保爱丽丝最终接受了拯救人类的想法。

WhatsApp实际上使用XMPP协议,而不是我上面概述的极为优越的协议,但是您明白了。


很好的解释。请分享更多与此相关的链接。
Rinku 2014年

29

据我所知,Ejabberd(http://www.ejabberd.im/)是父级,这是XMPP服务器,提供了很好的开源功能,Whatsapp使用了此版本的某些修改版本,facebook消息传递还使用了以下版本的修改版本这个。三星的ChatOn,Nimbuzz Messenger等更多聊天应用程序都使用了基于ejabberd的聊天软件,而Erlang解决方案也对该ejabberd进行了修改,声称它们具有很高的可扩展性,并且经过了更多的性能改进,经过了良好的测试,并更名为MongooseIM。

与其他服务器相比,Ejabberd是实现了大多数功能的服务器。由于它是在Erlang中构建的,因此可以在水平方向上高度扩展。


1
MongooseIM是旧的ejabberd的叉子。从13.x开始,ejabberd声称更好的可伸缩性是不正确的。ejabberd使用二进制文件来减少内存消耗,并且现在具有更多功能。这是你最好的。
的MickaëlREMOND

15.x版中的可伸缩性问题已解决吗?
Talespin_Kit

1
是的,正如我很久以来所说的那样。我们在13.x中引入了二进制结构。当然,我们在每个版本中都带来了更多的性能改进。您可以使用ejabberd 15.x来达到规模(我们为客户服务)。
的MickaëlREMOND
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.