IM系统的架构
IM全称Instant Messaging
早期的CS、P2P架构
IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步、存储和检索
- 消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的IM系统还支持『多端同步』。
- 消息的存储:消息存储即消息的持久化保存,传统消息系统通常只能支持消息在接收端的本地存储,数据基本不具备可靠性。现代消息系统能支持消息在服务端的在线存储,功能上对应的就是『消息漫游』,消息漫游的好处是可以实现账号在任意端登陆查看所有历史消息。
- 消息的检索:消息一般是文本,所以支持全文检索也是必备的能力之一。传统消息系统通常来说也是只能支持消息的本地检索,基于本地存储的消息数据来构建。而现在消息系统在能支持消息的在线存储后,也具备了消息的『在线检索』能力。
传统架构 vs 现代架构
服务的主体功能为提供消息的在线转发和离线消息的获取。从产品侧角度,衍生出多平台的同步转发、互踢及群组的需求。功能上需要提供消息指定路由转发、是否持久化、在线离线机制、心跳包、通知送达、授权验证等。从技术层次上划分,网络层提供长连接/短连接的服务,路由层提供转发,存储层提供持久化。额外的产品需求,还包含第三方的推送和订阅服务。
整体结构如下图:
具体功能:
1、用户接入及消息流程
如下图,用户登陆获取授权,通过jwt token 接入websocket,发送心跳及消息,消息路由到指定的在线用户
2、离线消息
用户的消息除了特殊可丢消息以外默认会入库,包含个人消息和组消息等,离线消息按照顺序存储。。为保证客户端能同步到离线的消息,客户端在启动或重连成功后,需调用离线接口直至空为止,表示客户端已取完所有离线。
3、推送
推送服务从中间件拉取消息,解析消息并补充相应的昵称等,组装消息调用第三方推送接口发送
4、订阅
支持第三方服务从订阅的群获取消息。目前订阅仅支持webhook,订阅服务通过实时的解析数据,调用相应的http接口进行消息的投递
第三方可通过http接口向指定群发送消息
5、统计
对活跃用户,用户消息,总用户数,当天新增用户量等进行统计
6、用户注册
添加用户时,生成唯一的id标识。
7、群成员管理
群成员添加删除及缓存处理,在服务维护成员关系,便于群消息的发送
8、用户管理系统
包含APP的用户同步,增删改查,用户关系
9、设置
用户的APP设置,如静音,屏蔽,拉黑关系等
10、登录
短信登陆、支持使用微信等第三方登录
11、多端的数据同步
含Android、ios、PC的数据同步