离线消息处理方案

离线的好友怎么获取离线消息?

对于好友聊天这种点对点的传输,我们只需将离线消息存到DB中,用户上线后执行一遍离线消息的拉取即可

离线的群友怎么获取离线消息?

  1. 最基本的方案:“在线的群友不存储消息,离线的群友才存储”,这样就会带来问题,如果在线的群友因为网络问题导致推送异常,则会漏消息
  2. 优化的方案:“不管群员是否在线,都要先存储消息” ,在线的群友收到消息则直接删除,离线群友下次上线后再删除,这样相当于一条消息存储多份,消息冗余,对存储介质造成了很大的浪费。
  3. 二次优化方案:“群消息实体存储一份,用户只冗余消息ID” ,这个优化,对于消息投递,以及消息删除的核心流程没有影响,实践为:
    • 在线用户投递消息实体,ack消息ID;
    • 离线用户先拉取消息ID,再拉取消息实体,再ack消息ID。
  4. 终级方案:利用群消息的“偏序”特性优雅地实现“只存1份”,这就意味着,每个用户只需要记录“最近一次收到的消息ID”,而不用记录“所有未收到的消息ID集合”,每当收在线消息ack,以及拉离线消息ack时,只需要更新这个“最近一次收到的消息ID”即可。对于在线的群友:收到群消息后,修改这个last_ack_msgid。对于离线的群友:拉取群消息后,也修改这个last_ack_msgid。但是此方案的前提是需要id呈自增或者自增趋势

你可能感兴趣的:(离线消息处理方案)