74

我很想知道不同的实时消息应用程序的架构。他们是否使用任何通用协议/架构?

4

3 回答 3

89

Facebook 以 190 亿美元购买的 WhatsApp 架构解释了 whatsapp 设计所涉及的架构。

这是链接中的一般解释

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

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

  • 伟大的成就是使用非常小的服务器占用空间来管理活跃用户的数量。团队一致认为这很大程度上是因为 Erlang。

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

  • WhatsApp 服务器已从 ejabberd 启动

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

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

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

  • 每天要处理 500 亿条消息,重点是建立一个可靠的系统。货币化是以后要看的东西,它还很遥远。

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

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

  • 通常每天都会推送一些代码。通常,它是一天多次,但通常会避免高峰交通时间。Erlang 有助于积极地将修复和功能投入生产。热加载意味着无需重启或流量转移即可推送更新。错误通常可以很快地被撤消,同样通过热加载。系统往往更加松散耦合,这使得逐步推出更改变得非常容易。

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

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

于 2015-03-19T04:40:15.063 回答
33

WhatsApp 选择了 Erlang,这是一种专为编写可承受错误而设计的可扩展应用程序的语言。Erlang 使用称为 Actor 模型的抽象来实现并发性 - http://en.wikipedia.org/wiki/Actor_(programming_language)与更传统的共享内存方法不同,参与者通过相互发送消息进行通信。与线程不同的 Actor 被设计为轻量级的。参与者可以在同一台机器上或不同的机器上,消息传递抽象适用于两者。WhatsApp 的一个简单实现可能是:每个用户/设备都被表示为一个参与者。这个actor负责处理用户的收件箱、它如何被序列化到磁盘、用户发送的消息和用户接收的消息。假设 Alice 和 Bob 是 WhatsApp 上的朋友。所以有一个 Alice 演员和一个 Bob 演员。

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

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

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

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

Bob 看到此消息并回复“为了 Alice:让我们创造巨型机器人来对抗它们”。这现在由演员 Bob 收到,如步骤 1 中所述。演员 Bob 然后重复步骤 2 和 3 以确保 Alice 最终收到将拯救人类的想法。

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

于 2014-07-26T06:08:17.470 回答
30

据我所知,Ejabberd ( http://www.ejabberd.im/ ) 是父级,这是 XMPP 服务器,它提供了相当好的开源特性,Whatsapp 使用了一些修改版本,facebook 消息传递也使用了修改版本这个。更多的聊天应用程序,如三星的 ChatOn、Nimbuzz messenger 都使用基于 ejabberd 的应用程序,而 Erlang 解决方案也有这个 ejabberd 的修改版本,他们声称它具有高度可扩展性和经过良好测试并具有更多性能改进,并重命名为 MongooseIM。

与其他服务器相比,Ejabberd 是实现了大部分功能的服务器。由于它是在 Erlang 中构建的,因此它具有高度的水平可扩展性。

于 2013-12-16T17:51:51.660 回答