科百科
当前位置: 首页 范文大全

怎么找活跃度高的本地群(几万条群离线消息)

时间:2023-08-12 作者: 小编 阅读量: 5 栏目名: 范文大全

为了减少离线消息的冗余度,增加一个群消息表,用来存储所有群消息的内容,离线消息表只存储用户的群离线消息msg_id,就能大大的降低数据库的冗余存储量。很容易想到,通过ACK机制,server返回离线消息之后,不能立刻删除离线消息,而必须等客户端ACK,才能删除。可以在客户端去重,对于重复的msg_id,对用户不展现,从而不影响用户体验。

怎么找活跃度高的本地群?继续答球友提问:(1)群离线消息是推还是拉?,我来为大家科普一下关于怎么找活跃度高的本地群?以下内容希望对你有帮助!

怎么找活跃度高的本地群

继续答球友提问:

(1)群离线消息是推还是拉?

(2)几万条群离线消息,怎么保证不丢失?

群离线消息,是推还是拉?

关于写扩散、读扩散的问题,之前专门撰文写过,今天不直接同步结论,重点说说设计的思考过程。

画外音:结论不如思路重要。

假如群离线是推,流程应该如何?会遇到什么问题?

先看看群离线消息的核心数据结构。

群成员表

t_group_users(group_id, user_id)

画外音:用来描述一个群里有多少成员。

群离线消息表

t_offine_msgs(user_id, group_id, sender_id,time, msg_id, msg_detail)

画外音:用来描述一个群成员的离线消息。

推,写扩散,存储群离线消息的过程如何?

(1)先从群成员表中,获取群里有多少个用户;

(2)从某个服务中,获取这些用户有多少个不在线;

(3)将群消息,插入到这些用户的群离线消息表;

画外音:如果要支持消息漫游,则可以省略步骤二。

此时,用户拉取离线消息的过程如何?

(1)用户登录,向server拉取离线消息;

(2)server返回并删除离线消息;

离线消息推,存在什么问题?

对于同一份群消息的内容,多个离线用户要存储很多份。假设群中有200个用户离线,离线消息则冗余了200份,这极大的增加了数据库的存储压力。

如何优化,减少消息冗余量?

为了减少离线消息的冗余度,增加一个群消息表,用来存储所有群消息的内容,离线消息表只存储用户的群离线消息msg_id,就能大大的降低数据库的冗余存储量。

群消息表

t_group_msgs(group_id, sender_id, time, msg_id, msg_detail)

画外音:用来存储一个群中所有的消息内容。

群离线消息表,需要进行优化:

t_offine_msgs(user_id, group_id, msg_id)

画外音:优化后只存储msg_id。

这样优化后,群消息的发送和存储要做一些升级:

(1)每次发送群消息之前,先存储群消息的内容;

(2)每次存储离线消息时,只存储msg_id,而不用为每个用户存储msg_detail;

相应的,拉取离线消息也要做对应的升级:

(1)先拉取所有的离线消息msg_id;

(2)再根据msg_id拉取msg_detail;

(3)删除时,只删除自己的离线msg_id,而不删除msg_detail;

画外音:毕竟msg_detail只存储了一份,不能随便删。

上述过程,能保证离线消息的可达性么?

不能。

例如:server返回客户端离线消息之后,删除了离线消息,但客户端没有展现就奔溃了,离线消息就会丢失。

如何解决离线消息可达性呢?

很容易想到,通过ACK机制,server返回离线消息之后,不能立刻删除离线消息,而必须等客户端ACK,才能删除。

此时,离线消息拉取升级为:

(1)用户登录,向server拉取离线消息;

(2)server返回离线消息;

(3)客户端确认收到了离线消息;

(4)server再删除离线消息;

画外音:增加了3和4两个步骤。

还有一个问题,一次有几十个群,每个群有几千条离线消息,共计几万条群离线消息,消息量过大怎么办?

当然不能一次性拉取,可以:

(1)分群拉取;

(2)每个群分页拉取;

(3)拉取一页,删除一页,拉取下一页,删除下一页...

如果拉取了消息,却没来得及应用层ACK,会收到重复的消息么?

可以在客户端去重,对于重复的msg_id,对用户不展现,从而不影响用户体验。

如上所示,简单总结就是:

(1)群消息表存储消息实体msg_detail;

(2)群离线消息表,存每个用户的msg_id;

(3)分页拉取 应用层ACK,即保证性能,又保证消息可达性;

(4)客户端msg_id去重,保证用户体验;

上面讲的都是“推”模式,群离线消息的设计,真正线上应用较多的,是“拉”模式。

推模式,存在什么问题?

对于离线的每一条消息,虽然只存储了msg_id,但是每个用户的每一条离线消息都将在数据库中保存一条记录,有没有办法减少离线消息的记录数呢?

对于一个群用户,在ta登出后的离线期间内,肯定是所有的群消息都没有收到的,完全不用对所有的每一条离线消息存储一个离线msg_id,而只需要存储最近一条拉取到的离线消息的time(或者msg_id),下次登录时拉取在那之后的所有群消息即可,而完全没有必要存储每个人未拉取到的全部离线消息msg_id。

拉模式,需要对数据结构进行怎样的升级?

群成员表,增加一个属性:

t_group_users(group_id, user_id, last_ack_msg_id)

画外音:用来描述一个群里有多少成员,以及每个成员最后一条ack的群消息的msg_id(或者time)。

群消息表,不变:

t_group_msgs(group_id, sender_id, time, msg_id, msg_detail)

画外音:还是用来存储一个群中所有的消息内容。

群离线消息表:不再需要。

使用拉模式后,群消息的发送和存储也要升级:

(1)在消息msg_detail存储到群消息表后,不再需要操作离线消息表(之前需要将msg_id插入离线消息表);

(2)用户收到消息,应用层ACK后,将last_ack_msg_id更新(之前需要将msg_id从离线消息表删除);

群离线消息的拉取流程也类似:

(1)分页拉取离线消息;

(2)ACK离线消息;

(3)更新last_ack_msg_id;

总结

群消息还是非常有意思的,做个简单总结:

(1)群离线消息一般采用拉取模式,只存一份,不需要为每个用户存储离线群msg_id,只需存储一个最近ack的群消息id/time;

(2)为了保证消息可达性,在线消息和离线消息都需要ACK;

(3)离线消息过多,可以分群拉取、分页拉取等优化;

画外音:还可按需拉取,登录不拉取,点进群再拉取。

(4)如果收到重复消息,需要msg_id去重,让用户无感知;

来源: 58沈剑 架构师之路

    推荐阅读
  • steam最新生存类游戏(steam上少见的好评生存类游戏)

    今天给小伙伴们安利一款生存游戏:TheForest(森林)。这款14年上线的恐怖生存游戏,一开始就被认为是跟风之作,当时“我的世界”、“泰拉瑞亚”、“饥荒”等游戏正热,所以森林上线的时候并未引起过太多人注意。不过野人除了超高的攻击性和极快的速度之外,智商几乎为零。而且游戏自由度极高,你可以按照自己想要的任何方式建造自己的房子,虽然说难以比肩《我的世界》这样的大作,但是如果你对像素游戏无感,那《TheForest》绝对不容错过。

  • 对手剧情介绍(电视剧对手剧情介绍)

    对手剧情介绍该剧根据袁道之、白莉小说《紫色密码》改编,主要讲述了第一次世界大战末期,文为均在美国普林斯顿大学数学系就读,他和来自日本的同学山本康夫爱上了同一个女人,又各自做出了牺牲。1917年,第一次世界大战席卷欧洲,而在美国的普林斯顿大学,来自中国的留学生文为均和来自日本的山本康夫,他们共同深爱着一个日本姑娘青田秀。异国同窗亲如手足,但却无法摆脱国家和民族的仇恨,他们将注定成为生死对手。

  • 隐秘的角落张东升的剧照(隐秘的角落张东升的伙伴们都用哪些手机)

    别走开,最后有惊喜环节。剧中两人共同使用这部手机。摩托罗拉E398采用16毫米超大双扬声器、3D立体声环绕音效、同步震动、两侧七彩韵律灯、相机补光、支持软件升级。这款手机仅有13.9毫米,比摩托罗拉刀锋V3还有薄,只不过定位中低端而已啦,对于一个刚刚参加工作的年轻民警来说,非常符合日常户外使用需求。朱永平:摩托罗拉V3V3是摩托罗拉非常经典的翻盖超薄金属机身手机,有“刀锋”之称,这部手机就拿下了全球1.3亿部的销量。

  • 大众uzz新款(未来将推出带有家具模块化的电动宿营车VW)

    近日,大众专为未来城市vanlife露营概念而开发的全新新能源电动e-van——VWID.Buzz首次曝光。目前已知的是通过Ququq的家具模块可实现宿营车各种功能的使用及用途。通过Ququq的家具模块,潜在的ID.Buzz后排区域可以获得存储空间、厨房和床。床下方可携带Ququq露营箱,另外,不同的模块组会带来不同的设计巧思和格局。未来将会有此类家具模块其它的供应商不断加入进来,并将ID.Buzz变成拥有未来科技感且可持续带来影响的宿营车。

  • 让体育成为一种生活方式(让体育成为你的习惯)

    发展体育运动,增强人民体质。——俄国诗人马雅可夫斯基运动的作用可以代替药物,但所有的药物都不能替代运动。参与比胜负重要,过程比结果重要,超越比得失重要。运动兴,民族兴;运动衰,民族衰。——马雅可夫斯基11长期的身体毛病使最光明的前途蒙上阴暗,而强健的活力就使不幸的境遇也能放金光。运动是一切生命的源泉。体育是填补空虚的最佳良药。体育应造就体格健壮的勇士,并且使健全的精神寓于健全的体格。

  • 秦皇岛哪里能办理报停供暖?(秦皇岛停暖气)

    1、团结里供热分公司地址:民族路与建设大街交叉口春晖客户服务中心乘车路线:乘9、18、20、24、微2、微8、41路到弘扬家具城下车,北行200米;乘7、28、43、41、46路,到世嘉铭庭站下车民族路口右转2、玉峰里供热分公司地址:玉峰里小区37栋楼后春晖客户服务中心乘车路线:乘2、10、29路,市政集团下车,东行500米,成大方圆药店小区入口一直向北走到头;乘3路西城里站下车天宝饭店西门北侧小

  • 香烤猪排做法图解(非常简单哦)

    下面希望有你要的答案,我们一起来看看吧!香烤猪排做法图解先把猪排敲打松弛,然后加上适量盐、黑胡椒、料酒,用手抹匀腌制一分钟。这个时候烤箱可以预热,把猪排先裹上淀粉,再沾满蛋液,最后沾满面包糠。然后放入铺有锡箔纸的烤盘中。放入烤箱中层、上下管200度烤分钟。烤制好的猪排切上条就可以上桌了。

  • 粉饼盘碎了怎么修补(摔碎的粉饼简单四步就能复原)

    但是如果不小心把粉饼掉在地上摔碎了特别心疼。第二步,将两勺无色液体放入碾碎的粉饼碗里搅拌均匀。粉饼和液体的比例是4:1。由于干燥时间较长,所以实验提前按照网友的方法制作好一个放置了12小时的粉饼。因为粉饼当中的黏合剂含有油脂成分,这种油脂成分能够溶于乙醇。专家说如果家里有浓度为75%的酒精的话也可以用,而且75%的酒精还可以起到一定的消毒作用。但是提醒大家如果皮肤对酒精过敏者慎用。

  • 什果西米露怎么做(什果西米露如何做)

    原料,西米150克,椰汁一听,火龙果1/2个,芒果1个,黄河蜜瓜1片,今天小编就来说说关于什果西米露怎么做?下面更多详细答案一起来看看吧!什果西米露怎么做原料,西米150克,椰汁一听,火龙果1/2个,芒果1个,黄河蜜瓜1片西米淘洗干净后,放入锅中,加水煮至无白心,取出用凉白开浸洗三次去掉表面粘液,使其呈透明状。将西米放入容器,加入椰奶,加入水果丁即成。

  • 七年级上册语文文言文练习题(七年级语文上册课内文言文基础训练及对比阅读)

    谢太傅寒雪日内集,与儿女讲论文义。陈太丘与友人相约同行,约定的时间是正午时分。友人感到惭愧,下车来拉元方,元方头也不回就进门了。屏除杂念和干扰来提高自己的修养,勤俭节约来培养自己的品德。年与时驰,意与日去。骨已尽矣,而两狼之并驱如故。骨头已经扔完了,可是两只狼像原来一样一起追赶(屠户)。一狼径去,其一犬坐于前。转身看柴草堆的后面,一只狼正在柴草堆中打洞,企图从通道进入来攻击屠户的背后。