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

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

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

    推荐阅读
  • 5000左右的女士腕表怎么选(女生第一支腕表怎么选)

    今天就给大家盘一盘,刚入门的姐妹们第一只大牌表应该如何去选择~浪琴妥妥的性价比之王!二级市场中千就可以买到很不错的表哦!欧米茄气质类的女生可以入手蝶飞系列,如果更喜欢BlingBling的钻表,星座系列一定不能错过!卡地亚卖得最好的就是蓝气球啦,二级市场小万轻松get!如果预算充足,那也可以选择绝不踩雷的劳力士!萧邦的设计则是出了名的好看!

  • 唐代诗人白居易的诗句绿蚁新醅酒红泥小火炉绿蚁指的是(问刘十九中绿蚁指什么)

    接下来我们就一起去研究一下吧!唐代诗人白居易的诗句绿蚁新醅酒红泥小火炉绿蚁指的是绿蚁指酒面上的绿色泡沫,也被作为酒的代称。晚来天欲雪,能饮一杯无?刘十九是作者在江州时的朋友,字里行间洋溢着热烈欢快的色调和温馨炽热的情谊,表现了温暖如春的诗情。天色将晚雪意渐浓,能否一顾寒舍共饮一杯暖酒。

  • 艾是墙布价格(艾是墙布属于高端品牌吗)

    艾是墙布精装体验店加盟计划艾是墙布为了改变目前终端销售现状推出“精装体验店加盟计划”。艾是精装体验店还将深入虚拟现实体验开发,以虚拟现实体验技术,促进全系产品的虚拟体验,引领门店销售全新趋势。作为行业风向标,艾是将为参展观众,呈现最新一季的墙布、窗帘搭配产品。

  • 避雷针谁发明的(避雷针谁发明的什么时间)

    富兰克林把这种避雷装置称为避雷针。接闪器是指直接截受雷击的避雷针的针头、避雷线、避雷带、避雷网,以及用作接闪的金属屋面和技术构件。避雷针的作用用来保护建筑物、高大树木等避免雷击的装置。当雷云放电接近地面时它使地面电场发生畸变。在避雷针的顶端,形成局部电场集中的空间,以影响雷电先导放电的发展方向,引导雷电向避雷针放电,再通过接地引下线和接地装置将雷电流引入大地,从而使被保护物体免遭雷击。

  • 高频rfid电子标签技术参数(超高频RFID抗金属电子标签在集装箱管理中应用)

    不仅是能够提高集装箱管理的工作效率,同时也能减少人工成本,因此RFID电子标签也成为了集装箱运输管理的最好选择之一。所以在对RFID电子标签的选择上,则需要选择具备超高频率的RFID抗金属电子标签,其读写稳定且读取距离远,安装在金属表面才能够进行稳定的工作。

  • 预防新型冠状病毒手抄报内容 预防新型冠状病毒手抄报内容怎么写

    2019年12月以来,湖北省武汉市发现多起病毒性肺炎病例,经相关病毒分型检测,2020年1月7日,实验室检出一种新型冠状病毒。某些冠状病毒可以在人与人之间传播,通常是在与被感染的患者密切接触之后,例如在家庭、工作场所或医疗中心。在更严重的情况下,感染会导致肺炎和严重的急性呼吸道综合症。部分患者起病症状轻微,可无发热。多数患者为中轻症,预后良好,少数患者病情危重,甚至死亡。

  • 生活种水果小妙招(生活种水果的方法)

    生活种水果小妙招橘子盆栽⑴把收集的橘子籽清洗干净,放水里浸泡一周,每天换一次水,浸泡过后的橘子会发胀。⑵种植橘子的土壤要选择疏松透气性好的,将橘子籽尖头朝上埋入土壤中,不用完全埋入;浇水。⑶之后每天浇水即可,1个月左右的时间小橘子苗就破土而出。⑷盆土使用疏松和排水良好的腐殖土或沙质土,将芒果种子放到土壤中,发出来嫩芽的一端朝上。⑸最后浇透水,放在有阳光照射的地方就可以了。

  • 奔马图简介(奔马图介绍)

    奔马图简介《奔马图》这件作品是画家徐悲鸿在1948年赠给史学家邓蜀生的礼物。画高3.26米、宽1.12米的这幅被列入国家一级文物的徐悲鸿平生所绘最大《奔马图》真迹。大师采用了豪放的泼墨和劲秀的线描写意方法,着重刻画出马的神韵和气质。画中的马雄骏、矫健、轻疾,颇有“瘦骨铜声”之美感,奔马强壮有力,生气勃勃,这幅《奔马图》不仅表现了马的精神和特征,更赋予了画家自己的个性和理想——为振兴民族艺术而奋斗!

  • 黄百鸣和张国荣97家有喜事(张国荣片酬仅收295万)

    张国荣是香港娱乐圈的超级巨星,无论是歌坛还是影坛他都取得很辉煌的成就。不过当年拍《家有喜事》却让他有点尴尬,因为他的片酬仅收295万,而刚崛起的周星驰片酬却高达800万,差距足足2.7倍之多。《家有喜事》片中男女主角每一位都是巨星,黄百鸣,张国荣,周星驰,张曼玉,吴君如,毛舜筠,其实这样的明星阵容缺了谁票房都会很卖座。该片上映后十分火爆票房狂收了4899万港元,排名年度第二,仅落后《审死官》5012万港元。

  • 花旗参炖生鱼(怎么做花旗参炖生鱼)

    跟着小编一起来看一看吧!花旗参炖生鱼主料:生鱼1条重约1斤,瘦肉4两,花旗参片5约,火腿1两,上汤5杯,姜1片。生鱼宰好洗净,抹干水,用少许油煎至两面微黄铲起。瘦肉出水过冷河。将各料同放炖盅内,加进沸水适量,加盖,用纱纸封好,隔沸水炖3小时,以盐调味,再封密,炖15分钟即成。