自研IM系统存储设计

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 后续扩展

  • 发送消息接口新增过滤器,用于过滤、监控、拒绝敏感消息
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,461评论 19 139
  • 一天晚上,朋友微信告诉我一件很神奇的事情。说有人捡到了我的银行卡。于是打电话过去跟朋友确认: ...
    Jenny日记阅读 3,465评论 2 7
  • 今天,听了戴旭教授的课 ,他霸气的感觉让我想起了他,满脑子都是!为什么影子挥之不去,我真的不想去想,可是偏偏忘不了...
    思情画意阅读 1,651评论 0 0
  • 凤凰涅槃_a5ec阅读 1,014评论 0 4
  • 淄博市西南有一座山脉叫西虎山,此山是海成岩青石的一种。北靠胶济铁路,西连济南千佛山,南接鲁山山脉,东临淄博市。 西...
    佛道圣师阅读 3,723评论 0 0