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

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


 上一篇
自研IM系统方案设计 自研IM系统方案设计
本文主要介绍APP功能中的IM模块的设计方案 1 设计原则 合适原则——合适优于业界领先 简单原则——简单优于复杂 演化原则——演化优于一步到位 架构设计的目的在于解决系统复杂度问题,真正优秀的架构都是企业当前人力、条件、业务等各种约束
2019-10-13
下一篇 
Jenkins搭建集成SonarQube最简实践 Jenkins搭建集成SonarQube最简实践
本文介绍在Linux环境下Jenkins如何整合SonarQube 环境准备 JDK环境JDK1.8 代码托管Gitlab 审查工具SonarQube 发布容器Tomcat 构建工具Maven 数据库MySQL 系统配置要求 OS内核需
2019-10-13
  目录