IM 消息数据存储结构设计
2021-02-04
在IM庞大的体系中,消息系统无疑是最核心的,而消息系统中,最关键的部分是消息的分发和存储。
在以往传统消息系统中,对于在线的用户,消息会直接实时发送到在线的接收方,消息发送完成后,服务器端并不会对消息进行落地存储。对于离线的用户,服务器端会将消息存入到离线库,当用户登录后,从离线库中将离线消息拉走,然后服务器端将离线消息删除,这样的缺点是消息不持久化,导致消息无法支持消息漫游,降低了消息的可靠性。而在我们的消息系统中,服务器只要接收到了发送方发上来的消息,在转发给接收方的同时也会在离线数据库以及历史消息库中进行消息的落地存储,消息的落地也就支持了整体的消息漫游等相关功能。
离线消息和历史消息的区别:
离线消息,就是用户在离线过程中收到的消息,这些消息大多是用户比较关心的消息,具有一定的时效性。我们的系统设计,离线消息默认只保存最近七天的消息。离线消息在用户登录后会全量的获取,然后客户端根据会话进行整体离线消息的展示。
历史消息,存储了用户所有的消息,包括发的消息以及接收的消息。在客户端获取历史消息时,是按照会话进行分页获取的。历史消息的存储时间我们系统设计默认为半年,当然这个是可配置的。
消息的发送以及存储的流程:
用户发送消息到服务器端后,首先会进入到消息系统中,消息系统会对消息进行分发以及存储。对于在线的接收方,会选择直接推送消息,但是遇到接收方不在线或者是消息推送失败的情况下,也会有另外的消息获取方式,接收方会主动向服务器拉取未收到的消息,但是接收方何时来服务器拉取消息以及从哪里拉取是未知的,所以消息存入到离线库的意义也就在这里。
在分发完消息后,消息服务会同步一份消息数据到历史消息服务中,历史消息服务会对消息进行落地存储。对于新的同步设备,会有消息漫游的需求,这也是历史消息的主要作用。在历史消息库中,客户端可以拉取任意会话的全量历史消息。