IM 全称是“Instant Messaging
”
,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中 IM 类产品已经成为必备品,比较有名的如钉钉、微信、QQ 等以 IM 为核心功能的产品。当然目前微信已经成长为一个生态型产品,但其核心功能还是 IM。还有一些非以 IM 系统为核心的应用,最典型的如一些在线游戏、社交应用,IM 也是其重要的功能模块。可以说,带有社交属性的应用,IM 功能一定是必不可少的。
IM 系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代多次,从早期的 CS、P2P 架构,到现在后台已经演变为一个复杂的分布式系统,涉及移动端、网络、安全和存储等技术的方方面面。其支撑的规模也从早期的少量日活,到现在微信这个巨头最新公布的达到 9 亿日活的体量。
IM 系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步和存储:
消息的同步
:将消息完整、快速地从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的 IM 系统还支持“多端同步
”
。
消息的存储
:消息存储即消息的持久化保存,这里不是指消息在客户端本地的保存,而是指云端的保存,功能上对应的就是“消息漫游
”
。“消息漫游
”
的好处是可以实现账号在任意端登陆查看所有历史消息,这也是高级 IM 系统特有的功能之一。
写扩散:
写扩散的消息同步模式,需要有一个额外的 Timeline 来专门用于消息同步,通常是每个接收端都会拥有一个独立的同步 Timeline,用于存放需要向这个接收端同步的所有消息。每个会话中的消息,会产生多次写,除了写入用于消息存储的会话 Timeline,还需要写入需要同步到的接收端的同步 Timeline。在个人与个人的会话中,消息会被额外写两次,除了写入这个会话的存储 Timeline,还需要写入参与这个会话的两个接收者的同步 Timeline。而在群这个场景下,写入会被更加的放大,如果这个群拥有 N 个参与者,那每条消息都需要额外的写 N 次。写扩散同步模式的优点是,在接收端消息同步逻辑会非常简单,只需要从其同步 Timeline 中读取一次即可,大大降低了消息同步所需的读的压力。其缺点就是消息写入会被放大,特别是针对群这种场景。
在 IM 这种应用场景下,通常会选择写扩散这种消息同步模式。IM 场景下,一条消息只会产生一次,但是会被读取多次,是典型的读多写少的场景,消息的读写比例大概是 10:1。若使用读扩散同步模式,整个系统的读写比例会被放大到 100:1。一个优化的好的系统,必须从设计上去平衡这种读写压力,避免读或写任意一维触碰到天花板。所以 IM 系统这类场景下,通常会应用写扩散这种同步模式,来平衡读和写,将 100:1 的读写比例平衡到 30:30。当然写扩散这种同步模式,还需要处理一些极端场景,例如万人大群。针对这种极端写扩散的场景,会退化到使用读扩散。一个简单的 IM 系统,通常会在产品层面限制这种大群的存在,而对于一个高级的 IM 系统,会采用读写扩散混合的同步模式,来满足这类产品的需求。