且听疯吟 如此生活三十年
WhatsApp 的一点分析

最近的项目需要做一个跨平台的 IM 服务,想要参考下其他项目的架构。国内分享不多,微信基本没有参考价值,毕竟 QQ 的积累在那。陌陌从招聘及据网上抓包的内容看是 XMPP 协议,看起来可能是 Java 的 openfire 之类的 XMPP 路线。
国外的分享稍微多一些,像 WhatsApp 每年都会做一些相关的分享,看起来有些参考价值。

WhatsApp 目前的数据

  • 月用户约为 4.65 亿
  • 每天有 190 亿 消息进站/ 400 亿消息出站
  • 6 亿图片,2 亿音频, 1 亿视频
  • 峰值并发连接为 1.47 亿
  • 消息峰值为每秒 34.2 万进站/ 71.2 万出站
  • 节日期间流量更加惊人

支撑这些数据的硬件

  • 约 550 台服务器
  • 约 150 台 chat server, 可以支持 1.5 亿连接
  • 约 250 台 mms 服务器
  • 数据服务器内存为 512 GB,标准节点是 64 GB
  • 除了视频,其他数据都存储在 SSD 上
  • 超过 11000 个核心
  • Mnesia 使用了约 2TB 的内存

服务端架构

  • 几乎全部使用 Erlang (经过了自己的改造)
  • 服务器使用的是 FreeBSD 9.2
  • 数据库是 Mnesia
  • ejabberd (做了大量改造,包括使用自己的协议替代 XMPP)
  • Yaws, lighttpd
  • 非常重视性能监控

Erlang

  • 大约 10 人的 Erlang 团队,工作包括开发和 ops
  • 服务端基本全部使用 Erlang 开发
  • 据说 Facebook Chat 开始也想要使用 Erlang ,但是由于优秀的 Erlang 工程师太难找而放弃了。不知真假,但是使用 Erlang 的好像的确不多。
  • 团队对 Erlang 和 ejabberd 做了大量优化以满足越来越高的要求。但是在初期 Erlang 的表现就已经很好了
  • 选择 Erlang 的原因是:
    • 只用很少的服务器就支撑起如此庞大的活跃用户,团队认为这归功于 Erlang
    • 在 SMP 上的优秀扩展性
    • 支持热更新

ejabberd

  • 最初从 ejabberd 开始
  • 选择 ejabberd 是因为这是个非常优秀的开源 jabber 服务器
  • 而且 ejabberd 是用 Erlang 写的
  • 持续的对 ejabberd 进行重写和修改,包括从 XMPP 转换到内部开发协议、调整代码库以及重设计一些核心组件,并对 Erlang VM 做了大量的修改以获得高性能 Whats

当年 WhatsApp 创始人去 Facebook 等企业求职被拒,据说原因之一是——年龄太大了。但也许只有老程序员才能坚持使用 Erlang 构建整个服务,并且用丰富的经验支撑起了整个 WhatsApp 庞大的架构——虽然主要是为了 WhatsApp 的庞大用户量而不单单是为了技术,Facebook 依然付出了 190 亿美元的代价。