我很想知道不同的实时消息应用程序的架构。他们是否使用任何通用协议/架构?
3 回答
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 请求唯一密钥。此密钥用作所有未来呼叫的“密码”。(这个“永久”密钥存储在设备上)。这也意味着注册新设备将使旧设备上的密钥失效。
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 协议而不是我上面概述的非常优越的协议,但你明白了。
据我所知,Ejabberd ( http://www.ejabberd.im/ ) 是父级,这是 XMPP 服务器,它提供了相当好的开源特性,Whatsapp 使用了一些修改版本,facebook 消息传递也使用了修改版本这个。更多的聊天应用程序,如三星的 ChatOn、Nimbuzz messenger 都使用基于 ejabberd 的应用程序,而 Erlang 解决方案也有这个 ejabberd 的修改版本,他们声称它具有高度可扩展性和经过良好测试并具有更多性能改进,并重命名为 MongooseIM。
与其他服务器相比,Ejabberd 是实现了大部分功能的服务器。由于它是在 Erlang 中构建的,因此它具有高度的水平可扩展性。