手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

前言


最近看了一篇关于qq场景设计,那么我们在面试中经常会有出一道场景题给你设计,考验下你相关领域的经验以及思考严谨,本篇基于国民应用QQ如何实现高可用的订阅推送系统 该文章创作,主要是用于对比技术方案不同,从而提高个人技术能力,还有思考问题可提高的地方。

场景


手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

分析

我们捕捉下关键词,超大流量,我们联想到很大的并发;其次是订阅场景,那么在用户巨大的情况下,这类数据的储存也是存在一定的问题,比如说500w用户,每人订阅2条就是千万以上,而且还有不同活动;第三个点是类似推送消息,让我想到推送可靠性、推送的效率而且还要保证机器的稳定性,比如说一下子推了一堆东西,然后把机器挤爆了,那就要把你拉去祭天了,嘿嘿~

我的设计方案


手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

  1. 存储量大,分为两种结构、扩容角度来谈

这里的业务分两种,一种用户订阅活动数据,一种是一个活动多少用户订阅,可能需求有时忽然需要统计一场活动它参与的人数,如果只保存用户的,你还需要遍历大量数据;还有另一种场景是推送,也是需要去统计,还不如以空间换时间,提前保存起来。

数据结构,用户订阅可以用redis hash,相当一个map,像我的话最多参与个某农药是吧,活动订阅的话也可以用redis hash去保存,这块涉及到变更,这种数据结构也是支持的。为什么不用mysql呢,我的想法主要还是考虑到数据量大了之后对性能的影响,当然你也可以分库分表解决。

至于扩容同样的道理,redis的内存也可以加,然后进行分片保存,比如说一个活动,大概1w人参与,分为10个key,根据用户id mod一下,每个key储存1k数据,以此类推,来避免big key对性能的影响。

当然实际大部分还是依赖mysql去实现,在中小厂没有这么大的用户体系,跟储存量,以及对性能的要求相对比较低。

  1. 发送量大,就是推拉模式的博弈

大家可以参考mq设计,也是推拉模式比较经典的设计思路。比如说推送可靠性、推送的性能,那我这里主要采用推的模式,我的考虑是拉取对服务端压力大,客户端频繁去请求或者定期请求,对服务器的压力都是巨大的。那么在推的模式下,服务端会累积大量的推送量,这里需要队列来削峰填谷,作为一个缓冲区域

  1. 领取量大,这是电商比较经典的扣库存、红包场景

扣库存的话可以用redis detr,或者list lpush去实现高性能,红包的话可以提前拆分好,然后具体金额数这个涉及到算法,比如让每个人平均一点,还是说随机一点。

到这里我们的设计就结束了,接下来看看我们方案跟qq的有什么不同吧~

与实际方案不同


1、数据储存方面,跟我们设想的一致,就是缺少了业务方创建活动数据储存

手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

2、推拉模式

手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

怎么讲呢,这里暴露了一个我们的思维被传统mq影响了,因为mq属于实时消费的,至于实际推送场景,可以放到本地去定时提醒,这又让我们学习到一种方法。这里是一种配合的方式,类似nacos配置,一般是定期拉取,如果有变更的话,通过push的形式让客户端再拉取一次,保证数据的实时性。

3、推送可靠性,这里是参考mq的设计

手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

4、是我们缺少的监控环节

这是正常的,因为我们做项目的时候,一般先把项目做起来,不然搞什么飞机对不对,都没有市场没有用户,你就把后续扩展搞得很齐全,这跟现实事物发展比较违背的。

我们要监控什么呢?推送的量,推送成功率,用户触达情况,最后做优化。

手机qq怎么添加订阅号,手机qq怎么添加订阅号消息?

埋点->上报->监控->优化,监控在里面起到数据依据、可视化的效果。

总结


在技术方案里面,我们学到了可以提前拉取然后提醒的方案,如果推送的话确实不在线的情况,会丢失这部分数据,它不像服务端一样24小时在线,当然我们可以通过短信来辅助提醒;其次是监控环节,这也给我们一个启示,就是项目后面阶段是需要对数据统计、数据监控上去下功夫。

作者:大鸡腿同学
链接:https://juejin.cn/post/7199065225760505912

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.gooyie.com/53779.html