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

112422_rq1J_236698.png

上一篇Blog我提到过,每一个Channel都有一个自己的leveldb做缓存。同时,有位朋友建议我不要用缓存,经过思考后,我依然决定使用缓存。我为什么要这么做呢。

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

我们可以按照2个主要情况分析:

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

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

对于第一种情况:

我们可以快速的将用户同步到K:SeqN-1处,如果Sender在这个时候发送数据,那么这个用户用K:SeqN-1再次同步Channel消息的时候就会发现K:SeqN的存在。

对于第二种情况:

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


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

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



转载于:https://my.oschina.net/u/236698/blog/478294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值