0%

聊天消息同步

假设每个message有个seq字段,唯一的代表先后的序号;

有数据库本地存储messages,只能保证储存了某一连续段的数据(或没有),每次可以选择取出开头为seq-1长为len的消息块,也就是seq-1~seq-len的消息;

远端http pull的messages永远是最新的,每次可以选择取出开头为seq-1长为len的消息块。

现在有个从大seq到小的消息list需要维护。

我的同步聊天消息的做法:

首先同步新消息<-

  1. 先读取本地数据库的最新的消息,加入list,没有数据也一样。
  2. 这时候list显示的是之前存入过的消息,需要和远端对比。如果发现本地的就是最新的,流程终止。
  3. 如果离最新消息有一段距离latest-list.first.seq,距离小于等于len,那么直接http pull并存到数据库中,中间无空隙,流程终止。
  4. 如果距离大于len,从最新拉取必然会有空缺导致list维护失败。可以从消息list的第一个开始往大维护,pull list.first.seq+len-1~list.first.seq加入到list头部,并加入数据库,回到步骤2。

同步旧消息->(OPT)

  1. 若想读取list较老的消息,也就是seq较小的,首先判断list.last.seq-1是否等于0,等于说明到头了。直接从DB中取出list.last.seq-1往后加入到list尾部,判断长度。
  2. <len,说明DB已经结束,跳步骤4。
  3. >=len,跳步骤1。
  4. 此后从http pull,首先判断list.last.seq-1是否等于0,等于说明到头了。pull list.last.seq-1往后加到list尾部并加入到DB,判断长度。
  5. <len,说明已经结束,流程终止。
  6. >=len,回到步骤4。