美文网首页架构之路
自研IM系统存储设计

自研IM系统存储设计

作者: caison | 来源:发表于2018-10-11 15:07 被阅读17次

    1 数据操作需求

    1.1 发消息

    • 发送方新增已发消息 (用于消息判重)
    • 接收方新增待收消息
    • 根据发送方用户ID查询最近100条已发消息(用于消息判重)
    • 消息持久化存储

    1.2 收消息

    • 根据接收方用户ID,最新已收消息ID,查询未收消息,支持分页查询,每次取1000条

    1.3 删除数据

    • 删除历史持久化存储数据
    • 删除历史已发消息,接收消息

    2 存储设计

    基本存储结构

    消息缓存存储使用redis,结构设计如下

    每个用户关联redis中的一个List和一个Sorted Set(有序Set):

    • List中只保留用户最近发送的100条客户端消息ID(UUID,由客户端生成)
    • Sorted Set中保留用户接收的消息,其中Set的score是服务端消息ID(long型,由服务端生成,递增);Set的member是消息对象,包括发送方,消息内容,时间戳,消息ID等

    发送消息操作

    主要步骤如下:

    • 步骤1 接收用户APP发送的消息报文,包括客户端消息ID
    • 步骤2 保存用户已发客户端消息ID,保存到用户已发消息List中
    • 步骤3 保存消息,保存到目标接收用户消息的Sorted Set中
    • 步骤4 消息持久化存储数据库
    • 步骤5 返回已发消息的服务端消息ID

    实际情况中,有可能消息是重发消息,这时需要在步骤2之前查询用户已发消息List,与客户端消息ID比对判重

    拉取消息操作

    在APP发送消息接口,拉取未收消息接口都会拉取消息,主要步骤如下:

    • 步骤1 用户APP基于本地已有最新服务端消息ID拉取消息
    • 步骤2 服务器基于用户接收消息的Sorted Set分页查询未收消息
    • 步骤3 返回消息

    过期无效数据清理

    • 用户已发消息List
      限定List大小为100,超过100清除最旧的数据

    • 用户接收消息的Sorted Set
      限定消息保存一个月,使用定时任务定时删除

    • 持久化数据库
      限定消息保存一个月,使用定时任务定时删除

    3 后续扩展

    • 发送消息接口新增过滤器,用于过滤、监控、拒绝敏感消息

    相关文章

      网友评论

        本文标题:自研IM系统存储设计

        本文链接:https://www.haomeiwen.com/subject/vbrmaftx.html