V-IM-PRO 消息存储机制介绍

146 阅读2分钟

消息存储机制介绍

在 VimMessageServiceImpl 类中,saveChatMessageToDatabase 方法负责将消息对象持久化到数据库,并确保相关索引的存在,以提升后续查询效率。其主要流程如下:

  1. 生成聊天键与集合名

方法首先通过 ChatUtils.getChatKey 生成唯一的聊天键(chatKey),并设置到消息对象中。随后,根据发送者、聊天室ID和聊天类型,动态生成 MongoDB 的集合名(collectionName),实现不同会话消息的分表存储。

chatKey生成方案是两个用户的id转long比较大小后,较小的在前面 message-min{min}-{max},群chatKey直接是 message-${groupId}。

  1. 确保索引存在

在保存消息前,方法会调用 ensureIndexes,为当前集合确保必要的索引(如 timestamp、messageType、extend.fileHash、chat_key 等字段),并通过 Caffeine 本地缓存避免重复创建索引,提升性能。

  1. 消息持久化

索引检查无误后,消息对象会被保存到指定的 MongoDB 集合中,实现消息的持久化存储。

  1. 未确认消息处理

最后,方法还会调用 ackService.saveUnAckMessage,将该消息记录为“未确认消息”,以便后续消息确认与可靠性保障。

设计亮点

  • 动态分表:根据会话动态生成集合名,便于大规模消息分布式存储与管理,分表数量可以自行调整,默认1000。
  • 索引自动维护:自动为关键字段创建索引,提升检索效率,并通过本地缓存减少重复操作。
  • 异步处理:方法支持异步调用,提升系统吞吐量,降低主流程阻塞。
  • 可靠性保障:集成未确认消息机制,便于消息可靠投递与状态追踪。

总结

saveChatMessageToDatabase 方法实现了高效、可靠的消息存储机制,兼顾了性能、扩展性与数据一致性,是消息服务核心的数据落地环节。