IM系统设计之消息存储
项目地址:git@github.com:muyixiaoxi/Link.git
消息存储结构
消息存储结构如下图所示
当用户A向用户B发送一条消息时
- 将消息发送给 server
- server 将消息进行持久化
- 判断用户B是否在线,如果在线直接转发;如果离线,将离线消息存储到B的离线消息存储库里;如果此时B为离线状态,那么当B下次登录时拉取离线消息存储库即可同步消息。
- 将消息持久化到客户端本地(前端的工作)
消息持久库和离线消息存储库我分别使用的是:MySQL、Redis。众所周知,Redis是基于内存的,那么当Redis宕机后,离线消息就会丢失。
这里有两种解决思路,两种思路都需要记录消息持久库里面记录消息的已读状态
思路一:
- 用户上线后,拉取离线消息,并将其在持久库里面的状态修改为已读
- 用户上线后,拉取离线消息,如果离线消息为空,则去持久库里同步未读的消息
思路二:
当Redis宕机后,管理员手动拉取
如果有更好的方法,欢迎大家在评论区讨论