现代IM系统中消息推送和存储架构的实现

前言

IM全称是『Instant Messaging』,中文名是即时通信。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。固然目前微信已经成长为一个生态型产品,但其核心功能仍是IM。还有一些非以IM系统为核心的应用,最典型的如一些在线游戏、社交应用,IM也是其重要的功能模块。能够说,带有社交属性的应用,IM功能必定是必不可少的。html

IM系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代屡次,从早期的CS、P2P架构,到如今后台已经演变为一个复杂的分布式系统,涉及移动端、网络、安全和存储等技术的方方面面。其支撑的规模也从早期的少许日活,到如今微信这个巨头最新公布的达到9亿的日活的体量。数据库

IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步和存储:缓存

  • 消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来讲,通常至少要支持在线和离线推送,高级的IM系统还支持『多端同步』。
  • 消息的存储:消息存储即消息的持久化保存,这里不是指消息在客户端本地的保存,而是指云端的保存,功能上对应的就是『消息漫游』。『消息漫游』的好处是能够实现帐号在任意端登录查看全部历史消息,这也是高级IM系统特有的功能之一。

本篇文章内容主要涉及IM系统中的消息系统架构,会介绍一种基于TableStore构建的消息同步以及存储系统的架构实现,可以支持消息系统中的高级特性『多端同步』以及『消息漫游』。在性能和规模上,可以作到全量消息云端存储,百万TPS以及毫秒级延迟的消息同步能力。安全

架构设计

本章主要会介绍基于TableStore的现代IM消息系统的架构设计,在详细介绍架构设计以前,会先介绍一种Timeline逻辑模型,来抽象和简化对IM消息同步和存储模型的理解。理解了Timeline模型后,会介绍如何基于此模型对消息的同步以及存储进行建模。基于Timeline模型,在实现消息同步和存储时还会有各方面的技术权衡,例如如何对消息同步常见的读扩散和写扩散两种模型进行对比和选择,以及针对Timeline模型的特征如何来选择底层数据库。微信

传统架构 vs 现代架构

image

上图是消息系统传统架构与现代架构的简单对比。网络

传统架构下,消息是先同步后存储。对于在线的用户,消息会直接实时同步到在线的接收方,消息同步成功后,并不会进行持久化。而对于离线的用户或者消息没法实时同步成功时,消息会持久化到离线库,当接收方从新链接后,会从离线库拉取全部未读消息。当离线库中的消息成功同步到接收方后,消息会从离线库中删除。传统的消息系统,服务端的主要工做是维护发送方和接收方的链接状态,并提供在线消息同步和离线消息缓存的能力,保证消息必定可以从发送方传递到接收方。服务端不会对消息进行持久化,因此也没法支持消息漫游。架构

现代架构下,消息是先存储后同步。先存储后同步的好处是,若是接收方确认接收到了消息,那这条消息必定是已经在云端保存了。而且消息会有两个库来保存,一个是消息存储库,用于全量保存全部会话的消息,主要用于支持消息漫游。另外一个是消息同步库,主要用于接收方的多端同步。消息从发送方发出后,通过服务端转发,服务端会先将消息保存到消息存储库,后保存到消息同步库。完成消息的持久化保存后,对于在线的接收方,会直接选择在线推送。但在线推送并非一个必须路径,只是一个更优的消息传递路径。对于在线推送失败或者离线的接收方,会有另一个统一的消息同步方式。接收方会主动的向服务端拉取全部未同步消息,但接收方什么时候来同步以及会在哪些端来同步消息对服务端来讲是未知的,因此要求服务端必须保存全部须要同步到接收方的消息,这是消息同步库的主要做用。对于新的同步设备,会有消息漫游的需求,这是消息存储库的主要做用,在消息存储库中,能够拉取任意会话的全量历史消息。分布式

以上是传统架构和现代架构的一个简单的对比,现代架构上整个消息的同步和存储流程,并无变复杂太多,可是其能实现多端同步以及消息漫游。现代架构中最核心的就是两个消息库『消息同步库』和『消息存储库』,是消息同步和存储最核心的基础。而本篇文章接下来的部分,都是围绕这两个库的设计和实现来展开。性能

2017云栖社区之星评选暨年度颁奖盛典_投票便可参与抽奖
阿里云

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,立刻就要抢光了。

Timeline模型

在分析『消息同步库』和『消息存储库』的设计和实现以前,在本章会先介绍一个逻辑模型-Timeline。Timeline模型会帮助咱们简化对消息同步和存储模型的理解,而消息库的设计和实现也是围绕Timeline的特性和需求来展开。

image

点击连接阅读全文

相关文章
相关标签/搜索