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

Wesley13
• 阅读 284

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

上一篇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

点赞
收藏
评论区
推荐文章
冴羽 冴羽
2年前
VuePress 博客之 SEO 优化(二)之重定向
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。本篇讲讲SEO与重定向。问题最一开始我使用GitHubPages服务建立了站点,地址是:,考虑到GitHub在国内访问速度的问题,我又在Gitee上同步了一份,地址是:后来我决定自己建站,地址是:后来我想怎么可以不搞下https呢?于是有了新的地址:再除此之外,
我是阿沐 我是阿沐
3年前
面试官嘲笑我,这你都不会?
01背景大家好,我是阿沐!你的收获便是我的喜欢,你的点赞便是对我的认可。多年前刚毕业出来工作的时候,那个时候刚毕业对缓存的使用基本上可以说很少涉及,在大学做课件设计或者小型项目也都是用不到缓存,再者说了我大学是做嵌入式写汇编语言和c语言的。当时出实习去找工作并不顺利,面试官问了知道redis和memcached区别嘛?额,我当时虽然也做了一些功课,就是恶补
Wesley13 Wesley13
2年前
layim的websocket消息撤回功能实现
我的大概思路就是,前端根据选取的内容获得他的cid,我的cid是js生成的uuid,然后:1、通过websocket广播给对应的人去删除localstorage里的缓存,2、ajax异步请求删除数据库里的数据记录3、如果对方此时也打开了聊天面板就要用jquery找到那条消息然后remove。由于目前发现layim3.6版本并没有给自己
Stella981 Stella981
2年前
Shodan的http.favicon.hash语法详解与使用技巧
  在Shodan搜索中有一个关于网站icon图标的搜索语法,http.favicon.hash,我们可以使用这个语法来搜索出使用了同一icon图标的网站,不知道怎么用的朋友请参考我上一篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fmia
Stella981 Stella981
2年前
Linus,一生只为寻找欢笑(完全版)
文章来源:池建强  微信:MacTalk!(http://static.oschina.net/uploads/space/2016/0417/074758_oIWK_1774694.jpg)这篇文章我在2013年2014年分十次左右完成的,记录了Linux作者Linus的故事,算是我写的最好的一篇长文。这篇文章分别发表在我自己的书《
Wesley13 Wesley13
2年前
JAVA面试——Redis
1、Redis是什么?都有哪些使用场景?Redis是一个使用C语言开发的高速缓存数据库。Redis使用场景:1)记录帖子点赞数、点击数、评论数;2)缓存近期热帖;3)缓存文章详情信息;4)记录用户会话信息。2、Redis有哪些功能?1)数据缓存功能;2)
Wesley13 Wesley13
2年前
Oracle语句总结
1,开始之前先看张图!(http://static.oschina.net/uploads/space/2015/0302/170102_jwKM_2008084.png)A表和B表是数据有重复部分的表,现在如果想获取A表中B表不存在的数据语句有两种:①.使用leftjoin;\假设俩张表中都有共同字段id\selecta.i
Stella981 Stella981
2年前
IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)
1、引言在中大型IM系统中,聊天消息的唯一ID生成策略是个很重要的技术点。不夸张的说,聊天消息ID贯穿了整个聊天生命周期的几乎每一个算法、逻辑和过程,ID生成策略的好坏有可能直接决定系统在某些技术点上的设计难易度。有中小型IM场景下,消息ID可以简单处理,反正只要唯一就行,而中大型场景下,因为要考虑到分布式的性能、一致性等,所以要考虑的问题
Stella981 Stella981
2年前
MongoDB高级查询[聚合Group]
接上一篇...见: http://my.oschina.net/zhzhenqin/blog/97949(http://my.oschina.net/zhzhenqin/blog/97949)Group为了方便我还是把我的表结构贴上来:!(http://static.oschina.net/uploads/space/2012/
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究