微信,whatsapp和其他信使应用背后的技术是什么?

时间:2013-10-28 16:57:50

标签: architecture protocols smartphone messenger

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

3 个答案:

答案 0 :(得分:72)

The WhatsApp Architecture Facebook Bought For $19 Billion解释了涉及whatsapp设计的架构。

  

以下是链接的一般说明

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

  •   
  • 执行后端邮件路由的服务器系统在Erlang中完成。

  •   
  • 很棒的成就是活跃用户的数量是以非常小的服务器占用空间来管理的。团队一致认为,这主要是因为Erlang。

  •   
  • 有趣的是Facebook聊天是在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会向指定的电话号码发送短信(这意味着WhatsApp客户端不再需要在同一部手机上运行)。根据密码,应用程序然后从WhatsApp请求一个唯一密钥。此密钥用作所有未来呼叫的“密码”。 (这个“永久”密钥存储在设备上)。这也意味着注册新设备将使旧设备上的密钥无效。

  •   

答案 1 :(得分:28)

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

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

  
    

Alice决定给Bob留言。 Alice的手机建立了与WhatsApp服务器的连接,并且确定此连接肯定来自Alice的手机。爱丽丝现在通过TCP发送以下消息:“对于鲍勃:一个巨大的怪物攻击金门大桥”。其中一个WhatsApp前端服务器对此消息进行反序列化,并将此消息传递给名为Alice的角色。

         
      

Alice扮演者决定将其序列化并将其存储在名为“Alice的已发送消息”的文件中,该文件存储在复制的文件系统中,以防止由于不可预测的怪物横冲直撞导致的数据丢失。然后,演员Alice决定通过传递消息“来自Alice的Msg1:巨型怪物攻击金门大桥”将此消息转发给演员Bob。演员可以通过指数后退重试,直到Bob演员确认收到消息。

             
        

Bob扮演者最终收到来自(2)的消息,并决定将此消息存储在名为“Bob的收件箱”的文件中。一旦它持久地存储了这个消息,那么演员将通过向演员发送一条消息表明“我收到了Msg1”来确认接收消息。演员爱丽丝现在可以阻止它的重试工作。然后演员鲍勃检查Bob的电话是否与服务器有活动连接。它确实如此Bob扮演者通过TCP将此消息流式传输到设备。

                 
          

鲍勃看到这条消息并回复“为爱丽丝:让我们创造巨型机器人来对抗他们”。现在,这是由演员鲍勃接收到的,如步骤1中所述。演员随后重复步骤2和3,以确保爱丽丝最终收到将拯救人类的想法。

        
      
    
  

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

答案 2 :(得分:26)

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

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