IM的群组消息同步具体设计

上一篇Blog我提到过,每个Channel都有一个本身的leveldb作缓存。同时,有位朋友建议我不要用缓存,通过思考后,我依然决定使用缓存。我为何要这么作呢。git

如上面图的场景,一个Sender,两个Reciver。其中一个Reciver是一个一直在线的用户,而另外一个Reciver是一个由于某种缘由离线了一小段的用。在途中Channel中的K为键而V为数据。github

咱们能够按照2个主要状况分析:缓存

  1. Reciver是暂时离线有同步Key。spa

  2. Reciver全新加入一个Channel无同步Key。队列

对于第一种状况:ci

咱们能够快速的将用户同步到K:SeqN-1处,若是Sender在这个时候发送数据,那么这个用户用K:SeqN-1再次同步Channel消息的时候就会发现K:SeqN的存在。get

对于第二种状况:同步

按照小时切分数据,咱们很容易计算出当前小时区间,同时咱们知道小时队列中有多少数据。咱们能够快速的给出最后N-1条数据,并将用户同步到K:SeqN-1。若是用户要翻看前面的历史,咱们一样能够使用K:Seq1向前同步。it


那么这么作的好处是什么,就是全部群组中的用户看到的消息顺序是一致的,而非像QQ群组那样,偶尔出现,某我的和群组中全部人的消息顺序不一致的问题。channel

模型简单实现https://github.com/DavidAlphaFox/mm_channel

相关文章
相关标签/搜索