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

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

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

    推荐阅读
  • 五年级下册第六单元重点复习(五年级下册第六单元需要识记)

    本单元共编排三篇课文,包括《自相矛盾》《田忌赛马》《跳水》。夫不可陷之盾与无不陷之矛,不可同世而立。结果一一比赛时,田忌取得胜利。在田忌的引荐下,齐威王任命孙膑为军师。曹操乘机全线出击,歼灭袁军主力,奠定了统一北方的基础。经过一一猴子将帽子挂到了桅杆顶端最高的横木的一头,孩子为了追回帽子,走上横木,陷入了危险的境地。结果一一船长果断用枪逼迫孩子跳水,水手们救起了孩子,使孩子转危为安。

  • 马来西亚自由行费用一览表(你也该去一次马来西亚沙巴岛)

    艾京生钟楼于1905年完工的钟楼是亚庇市区最老的建筑之一。在第二次世界大战中,艾京生钟楼是市区建筑保存至今的三栋建筑之一,并于1998年被指定为历史古迹。在沙巴主要有四类食品——马来西亚风味美食、新鲜实惠的海鲜、“全球通行”的西餐和令人垂涎欲滴的热带水果,可满足各类食客的需要。其独特的风味享誉全马,甚至扬名海外,深受各地游客喜爱。不要当众表示亲热,如果对方是异性,不可有身体接触;不能把脚底或鞋底对准别人。

  • 爬雪山过草地是哪一年(都有那些雪山)

    爬雪山过草地是哪一年1935年6月红军开始进军,先头部队先后翻过五座大雪山。其中,夹金山就是红军翻过的第一座雪山。1935年8月红军开始过草地,草地就位于青藏高原与四川盆地的过渡地带。主要是现在的川西北若尔盖地区。而草地地区气候更是恶劣,遍布沼泽地,步步惊心。

  • 孕妇梦到李子是什么意思(孕妇梦见李子的预示)

    我们一起去了解并探讨一下这个问题吧!孕妇梦到李子是什么意思出行的孕妇梦见李子,建议遇雨则延期出发。本命年的孕妇梦见李子,意味着在如意中勿傲勿慢,宜守不宜进,逞强则进退两难。恋爱中的孕妇梦见李子,说明先有个家屋,婚姻可成,时节延长。做生意的孕妇梦见李子,代表有利流动中盘商,目前有阻碍,夏季较好。

  • 党的宗旨和使命是什么 党的宗旨目标使命

    党的宗旨是全心全意为人民服务,党的初心和使命是为中国人民谋幸福,为中华民族谋复兴。初心和使命是党的宗旨在新时代展现:中国共产党的诞生,给中华民族点燃了光明的火炬,给灾难深重的中国人民带来了希望。中国共产党走过的90多年奋斗的历程,始终不忘共产党人的初心和使命,以全心全意为人民服务为宗旨。

  • people怎么读(英语people怎么读)

    英语people怎么读people英[ˈpiːpl]美[ˈpiːpl],n.人;人们;大家;(统称)人民,国民;民族;种族;vt.居住在;把…挤满人;住满居民[例句]Somepeopledontknowwhentheyre。

  • 面试技巧心得体会(面试技巧学习心得)

    面试技巧心得体会首先,最不容忽视的一点就是仪容仪表了。在面试中,根据面试内容和环境,注意发型和衣着,是给面试官留下一个好印象的第一步。一个面试者的肢体语言很重要。语言表达也是非常重要的。面试时,要对面试的公司有所了解,同时还需要了解公司想要招聘什么样的人。针对需求做好准备,表现出对这次面试的重视和积极态度,也能提高录取几率。

  • 成熟的猕猴桃怎么保存(成熟的猕猴桃保存时间)

    以下内容希望对你有帮助!成熟的猕猴桃怎么保存猕猴桃放置在阴凉处可保存两个星期。不可将猕猴桃拿出放置通风处,这样水分流失,就会越来越硬。正确的方法是,放置箱子中,挑选处软的可食用的猕猴桃后要将箱子盖好。猕猴桃放在冰箱以保持新鲜度,冰箱冷藏约可储藏20~25天。

  • 为什么电视显示无信号(为何电视显示无信号)

    通常这一种现象容易出现在数字电视机顶盒上,这时需要先排除机顶盒和电视机之间的音视频连接线有没有问题,这极大可能是因为电视射频输入信号线没有连接到机顶盒的RF输入端口上,或者电视机射频输入信号线没有和终端盒连接导致的,将连接线重新连接好后问题即可解决。AV和HDMI信号不通畅。

  • 女孩连续熬夜加班猝死公司要负责(22岁女孩连续熬夜加班猝死)

    22岁女孩连续熬夜加班晕倒,被送进ICU抢救数天于26日离世。7月28日,极目新闻记者从惠惠家属处了解到,孩子的遗体已送回江西老家,并已火化。7月28日,惠惠的一名亲属徐女士告诉极目新闻记者,惠惠的遗体已经从杭州运回到江西老家,28日上午已经火化。此外,如果单位存在强制性加班,则也需对女孩的死亡承担一定法律责任。柴欣提醒称,单位无权强制员工加班。