本文由融云技术原创分享,原题“IM 消息数据存储结构设计”,内容有修订。
在如今的移动互联网时代,IM类产品已是我们生活中不可或缺的组成部分。像微信、钉钉、QQ等是典型的以 IM 为核心功能的社交产品。另外也有一些应用虽然IM功能不是核心,但IM能力也是其整个应用极其重要的组成部分,比如在线游戏、电商直播等应用。
在IM技术应用场景越来越广泛的前提下,对即时通讯IM技术的学习和掌握就显的越来越有必要。
在IM庞大的技术体系中im资讯,消息系统无疑是最核心的,而消息系统中,最关键的部分是消息的分发和存储,而离线消息和历史消息又是这个关键环节中不可回避的技术要点。
本文将基于IM消息系统的技术实践,分享关于离线消息和历史消息的正确理解,以及具体的技术配合和实践,希望能为你的离线消息和历史消息技术设计带来最佳实践灵感。
在通常的IM消息系统中,对于实时消息、离线消息、历史消息大概都是下面这样的技术思路。
对于在线用户:消息会直接实时发送到在线的接收方,消息发送完成后,服务器端并不会对消息进行落地存储。
而对于离线的用户:服务器端会将消息存入到离线库,当用户登录后,从离线库中将离线消息拉走,然后服务器端将离线消息删除。
这样实现的缺点就是消息不持久化,导致消息无法支持消息漫游,降低了消息的可靠性。
(PS:实际上,这其实也不能算是缺点,因为一些场景下存储历史消息并不是必须的,所谓的消息漫游能力也不是必备的,比如微信。)
IM电竞
而在我们设计的消息系统中,服务器只要接收到了发送方发上来的消息,在转发给接收方的同时也会在离线数据库及历史消息库中进行消息的落地存储,而历史消息的落地也就能支持消息漫游等相关功能了。
离线消息就是用户(即接收方)在离线过程中收到的消息,这些消息大多是用户比较关心的消息,具有一定的时效性。
IM电竞
用户(即接收方)在下次登录后会全量获取这些离线消息,然后在客户端根据聊天会话进行离线消息的UI展示(比如显示一个未读消息气泡等)。
(PS:用户离线的可能性在技术上其实是由很多种情况组成的,比如对方不在线IM电竞、对方网络断掉了、对方手机崩溃了、服务器发送时出错了等等,严格来讲——只要无法实时发送成的消息,都算“离线)历史消息:
历史消息存储了用户所有的聊天消息,这些消息包括发出的消息以及接收到的消息。
消息系统存储离线的过程中,为了不影响整个系统的更为平稳,我们使用了MQ消息队列进行IO解偶IM电竞,所以聊天消息实际上是异步存入到离线库中的(通过MQ进行慢IO解偶,这其实也是惯常做法)。
1)对方的 ID(如果是单聊的话就是对方的 UserID,如果是群则是群组ID);
国家明确信号,中国要从房地产强国转变IM电竞,住房问题将这样解决
2023年按工龄上调养老金,20年400元、30年800元,能实现公平性吗
深夜风暴!五大国际巨鳄集体爆雷,美股期指大跳水!什么情况?A股千亿巨头突发,这条赛道怎么了?