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 亿美元的代价。