消息存储机制介绍
在 VimMessageServiceImpl 类中,saveChatMessageToDatabase 方法负责将消息对象持久化到数据库,并确保相关索引的存在,以提升后续查询效率。其主要流程如下:
- 生成聊天键与集合名
方法首先通过 ChatUtils.getChatKey 生成唯一的聊天键(chatKey),并设置到消息对象中。随后,根据发送者、聊天室ID和聊天类型,动态生成 MongoDB 的集合名(collectionName),实现不同会话消息的分表存储。
chatKey生成方案是两个用户的id转long比较大小后,较小的在前面 message-{max},群chatKey直接是 message-${groupId}。
- 确保索引存在
在保存消息前,方法会调用 ensureIndexes,为当前集合确保必要的索引(如 timestamp、messageType、extend.fileHash、chat_key 等字段),并通过 Caffeine 本地缓存避免重复创建索引,提升性能。
- 消息持久化
索引检查无误后,消息对象会被保存到指定的 MongoDB 集合中,实现消息的持久化存储。
- 未确认消息处理
最后,方法还会调用 ackService.saveUnAckMessage,将该消息记录为“未确认消息”,以便后续消息确认与可靠性保障。
设计亮点
- 动态分表:根据会话动态生成集合名,便于大规模消息分布式存储与管理,分表数量可以自行调整,默认1000。
- 索引自动维护:自动为关键字段创建索引,提升检索效率,并通过本地缓存减少重复操作。
- 异步处理:方法支持异步调用,提升系统吞吐量,降低主流程阻塞。
- 可靠性保障:集成未确认消息机制,便于消息可靠投递与状态追踪。
总结
saveChatMessageToDatabase 方法实现了高效、可靠的消息存储机制,兼顾了性能、扩展性与数据一致性,是消息服务核心的数据落地环节。