77百科网
当前位置: 首页 生活百科

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

时间: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沈剑 架构师之路

    推荐阅读
  • 草书简牍(书谱草书系列方)

    今天学一段董其昌的书论:古人作书,必不作正局。盖以奇为正,此赵吴兴所以不入晋、唐门室也。《兰亭》非不正,其纵宕用笔处,无迹可寻。柳公权云“笔正”,须善学柳下惠者参之。董其昌黑赵孟的言论不必当真。他的论述也有自相矛盾之处。董其昌的字有人觉得软,但在造险和字内空间的营造上是很有功力的。我本人也是经常学习我自己的内容,觉得也受益颇多哦(惭愧)。

  • 新鲜西梅的皮可以吃吗 西梅果皮可以吃吗

    因为西梅的果皮本来就含有一层果蜡,这才使得西梅保鲜效果较好。而且西梅的果皮并不是很硬,就跟其它水果一样的味道,西梅果皮不仅能吃,还特别有营养。抗衰老西梅皮含有多种看氧化的物质,比如白藜芦醇、花青素、单宁酸以及维生素A等,这些成分对体内的自由基都有清除作用,能起到抗氧化、缓解衰老的功效。

  • 光遇怎么去星光沙漠 光遇星光沙漠小王子藏在哪里

    4、星光沙漠非常漂亮,月光洒在紫色的沙漠上,色调偏向紫色,有一种静谧和浪漫的情调,非常适合找个CP一起打卡截图。

  • 快到绝经的5个征兆(9个症状看你准备绝经了没)

    具体月经紊乱的表现如:1、经期延长绝经前月经周期会慢慢延长,或者不规律,出现间歇性闭经,两次月经相隔的时间越来越长由正常的20到30天变为两到三个月,甚至更长的时间一次,直至最后月经不再来潮。

  • 小奶狗如何正确喂养(怎么喂养小奶狗)

    小奶狗如何正确喂养?以下内容大家不妨参考一二希望能帮到您!由于小奶狗刚刚断奶,大多数的小狗都还会有奶瘾,所以作为主人可以考虑买宠物专用的奶粉给它饮用,但是要注意喝的量不要过多,每次一点点就好,但对于一些不太会喝奶的小狗来说,可以考虑用奶瓶进行喂养。

  • 文登区地名(千百年呼唤你的名)

    二十四节气准确地反映了自然节律变化,在人们日常生活中发挥了极为重要的作用。讲解员介绍,在文登境内共有18处新石器时代的遗址,其中一处便是位于界石镇的旸里店遗址。这枚秦权,证明秦始皇“普施明法,经纬天下,永为仪则”的影响所及已达秦疆东陲——文登。据史学家考证,西汉时在今文登区宋村镇一带设昌阳县,昌阳古城遗址也被考古学者认定为汉代建筑。文登何时被冠以文登之名,有两种说法。

  • 雅马哈劲豹125全部车型(售价6千多雅马哈新)

    雅马哈劲豹125全部车型说起踏板摩托车,相信国内的车友都不会陌生,在众多摩托车类型里面,踏板摩托车在人们的生活当中发挥着非常重要的作用。除此之外,在续航方面,这款车拥有一个5.2升的油箱,根据雅马哈这款发动机的百公里2升左右的油耗,预测续航里程能够达到200公里以上,中短途出行没有太大压力。

  • 动车可以刷身份证进站吗(动车刷身份证进站需要满足什么条件)

    旅客使用居民身份证完成网购铁路电子客票后,可将二代居民身份证原件作为乘车凭证,在车站自动检票机办理进、出站检票手续以及在列车上办理验票手续。使用二代居民身份证的旅客,如需车票报销凭证,须在开车前到铁路客票代售点或车站售票窗口换取纸质车票。若车票已取出,就不能刷身份证过闸机了,必须凭票进、出站。

  • 金砖国家有几个成员申请加入(两国正式申请加入)

    伊朗外交部发言人赛义德·哈提卜扎德在28日的新闻发布会上表示,伊朗已正式提交加入金砖国家的申请。在24日举行的全球发展高层对话会上,伊朗总统莱希就亲自表示期待加入金砖国家。对于金砖国家的扩容问题,中国领导人也有明确的态度。6月23日,在金砖国家领导人第十四次会晤上的讲话中,主席指出,近年来,不少国家提出希望加入金砖合作机制。

  • 温暖的弦剧情介绍(温暖的弦介绍)

    原来温暖和南弦曾是一对恋人,由于误会而分手,温暖回来一方面帮助南弦创业,另一方面挽回和南弦的爱情。在经历了冷氏招标案、益众挖角事件、代理商纠纷等事件之后,南弦和温暖不仅迎来了美好的爱情,还携手压制了不良竞争,净化了整个行业,让高科技行业在更加健康的环境下稳步发展。