很多IM都提供撤回的功能,即:
1、消息发送方消息发出后2分钟之内可以选择撤回,则接收方的客户端会将对应消息变为 “***撤回一条消息”;
2、撤回的消息1天之后不展示在对话框中;
消息主表 Message 的 status 字段扩展一个状态:撤回。如果用户选择撤回,则将这条消息的状态变为撤回即可;
尝试撤回的时候,先判断 created_at 是不是2分钟以前的,如果是则提示撤回失败;如果不是,则更改 status 字段。
如果用户当前正打开着对话框,由前端将具体消息替换为:”***撤回一条消息“;如果用户重新打开对话框的时候,读取到撤回状态的消息,则替换为:”***撤回一条消息“;
起一个定时任务,每分钟跑一次,将24小时之前的撤回状态的消息标记为已删除;
但是大流量的系统肯定都有缓存,那消息撤回之后缓存里面的数据如何更新呢?
首先,缓存key的设计上以对话框为单位,无论两人对话还是群消息,都是一个key;缓存的内容上,包括 sender+content+create_time;缓存的介质采用 Redis 的 list;缓存的长度上,只保存最近100条的数据即可;缓存的更新策略采用主动更新+被动失效,如果消息有变更,主动触发更新缓存的策略,如果长期没有消息变更,则1天后缓存失效。
这样的话,如果消息被撤回,触发异步流程,从数据库里读取最新的消息到缓存中即可。