空降流量危机?QQ音乐升级架构应对高并发

news2025/1/4 20:15:34

0b947607b4146538d724b879399c7953.gif

# 关注并星标腾讯云开发者

# 每周3 | 谈谈我在腾讯的架构设计经验

# 第2期 | 赵威:QQ音乐评论系统如何实现高可用?

b737321206ef39a500f08e1754bdb916.png

1fff2ab08f3690b8e6b84649091bc921.png

QQ 音乐自诞生以来,已有多个版本的评论业务系统。最新版本是19年再次全新迭代,基于 tlist 存储,按照发表时间顺序展示。后续为了更好的用户体验,产品形态调整为评论盖楼模式,为了实现该功能,存储迁移到 mongo。

4e15295770c60baca36107210db20c6d.png

目前评论作为用户社交重要场景以及艺粉互动(明星空降)重要场地,经常会有突发流量。为了更好地保障空降场景评论体验,我们对评论系统进行充分的设计。

62c1a1a590aa8ba6750a6d3a8b5a1c11.png

评论系统设计核心挑战点在于艺人空降时需要扛住突增的读写压力,包括评论数量、评论列表等读场景,以及发表评论,艺人评论置顶等写场景。

f4904b2634bb951ca3fe75973a194feb.png

如果直接读 mongo,需要用非常高的存储成本来抗住读压力。对于高并发热 key,常规使用缓存方案,在缓存使用中注意做好防穿透以及限流策略,防止存储高负载雪崩。

f8184f7871b7f043ff61177a43c9b829.png

8bd603fcc52e2435d64a78155c120108.png

评论写涉及比较复杂的业务逻辑,整体流程包含:

▶︎ 评论安全打击;

▶︎ 评论发布属地信息查询并记录;

▶︎ 评论是否需要置顶;

▶︎ 评论是否乐评人评论。

▶︎ ......

它涉及多个操作,部分处理失败会造成比较严重的体验问题。需要保障数据处理的一致性。为了保障一致性,一种是使用事务处理,强一致,但吞吐量稍微差些。另一种是使用可重入保障最终一致性,为了保障更高的吞吐量,写场景采用了最终一致方案。

b2811eb0535a8313877953cdeb42a407.png

通过消息队列解耦将评论写入高速 cache,异步写入 mongo。同时也能通过重试,确保比较核心数据最终写入 mongo。

通过上面两种设计,能在正常情况下很好满足日常评论的吞吐量,那是否真正做到高可用呢?随着业务迭代,在 add 消费场景再次增加了业务逻辑,比如增加上报,如果业务延时增加比较大或前置属地查询失败比较多时,整体 add 流程处理时延严重增加,导致消费效率下降、消息堆积,最后导致大盘全部评论全部延迟消费,用户体验出现发布后没有外显丢评论的体验问题。

评论系统引入热门消息队列,将全局评论和热门评论的消息队列做拆分。当热门消息过多时,最多只影响局部热门消息队列的堆积,对全局评论体验不影响。

55f3ea417a14f34ddd885a7edcae4860.png

上面没有在生成时直接写两个消息队列 topic,而采用对已有的消息队列再消费写入到热门消息队列,是由于下游还有很多场景在消费原有的消息队列,比如各种任务系统等,为了减少开发成本,采用了目前的方案。

采用上面的读写设计,基本能满足日常空降场景评论系统的可用性。随着空降参与艺人粉丝越来越多,业务遇到新的挑战。

f3639894704c95eca2cd4c9d55aca044.png

艺人空降评论区艺粉互动效果不错,越来越多艺人空降评论区。粉丝参与热情高涨,读写流量节节高升,空降活动导致评论系统挑战越来越大,需要系统优化保障服务质量。我们通过如下方式来处理挑战:

▶︎ 增加写消费效率:增加 mongo 存储的存储核数,并增加消费并发度;

▶︎ 读服务平行扩容,并拆分缓存到更多的 key(uin%10等),防止热 key 太集中,增加读服务吞吐量;

▶︎ 拆分读服务和写服务部署,防止读写互相影响;

▶︎ 非关键场景限流,保障核心路径的可用性。

通过上述手段,保障空降活动大致稳定可靠,虽然遇到消费瓶颈,导致写场景有轻微堆积,但用户感知没有那么强烈。

74cf888d60d07db93e22d488090ff94d.png

其中一次大牌艺人活动中评论系统整体稳定可靠,但还是遇到了消费瓶颈,且中间出现了依赖存储 ckv 由于设置了降冷,在访问量非常高且空查询比较多的情况下,大量请求降到降冷存储 tssd。由于 tssd 降低成本设计未充分业务隔离,导致全平台 tssd 告警的问题。虽然通过限流紧急处理,但还是需要有系统性优化。

近期通过以下方面完成了相关的优化:

读场景

▶︎拆分评论数、点赞数存储从 ckv 迁移到 ckv+,不降冷,尽可能保障这两个数据可用性;

▶︎评论数增加本地缓存,增加版本号,保障用户体验无异常且评论数的高吞吐量;

▶︎前端保护后端,合理化请求时机,并在前端有数据情况下,遇到评论数或列表拉取异常时,前端不弹异常,减少异常感知;

▶︎前端优化页面体验,提升秒开率,提升用户体验。

写场景

▶︎ 拆分评论写场景逻辑,保障核心路径简化,优先保障写 mongo 速度和吞吐量,减少消息堆积概率;

▶︎ 增加优先级队列,保障艺人核心体验无阻塞;

▶︎ 完善相关工具建设,随时可以跟进相关数据或运营诉求,提升运营效率。

压测

▶︎读写场景常规压测,确保压测出业务瓶颈在运营场景需要情况下,能快速通过平行扩容,保障系统可用性。

通过一系列流程和架构优化,评论系统可用性得到进一步提升,相信在未来运营场景能很好地保障用户体验。欢迎各位在评论区交流讨论。以上就是本篇文章的全部内容了,如果文章对你有帮助,欢迎转发分享。

你亲历过哪些考验项目高并发/高可用的场景?你有什么可以分享的高并发/高可用经验吗?欢迎留言。我们将挑选一则最有趣的答案,为其留言者送出腾讯定制毛毯。8月16日中午12点开奖。

82618a07e5849a02f22b7ea2b620a46b.png

c5f53eaba928db9e4cd441935000f937.png

0ffd6f58aabff362f64759b83b1b18a4.png

ef963957206804a6e997fdad342052f3.png

822ff443a422623b515d27203485ba04.png

531d7c94f72940bbd5b75f29d05ab5b6.png

关注并星标腾讯云开发者

第一时间看鹅厂架构设计经验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/861170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

章节4:JavaScript操作Cookie

章节4:JavaScript操作Cookie 直接利用Cookie登录 JavaScript语法 获取:document.cookie; 设置:document.cookie“usernamexx”; 删除:document.cookie“usernamexx;expiresThu, 01 Jan 1970 00:00:00 GMT”;

Goland报错 : Try to open it externally to fix format problem

这句报错的意思也就是 : 尝试在外部打开以解决格式问题 解决方案 : 将图片格式该为.png格式,再粘贴进去就可以了! 改变之后的效果 : 那么,这样就ok了

Unity ML-Agent

介绍: 环境搭建 待为完序

javascript数据类型与引用类型的区别以及原始值详解

基本数据类型介绍 在JavaScript中,数据类型可以分为基本数据类型与引用数据类型.其中基本数据类型包括 Undefined,Null,Boolean,Number,String5种数据类型,在ES6中新增了两种基本的数据类型,Symbol,bigint 引用类型有Object,Function,Array,Date,RegExp等 这两种类型区别简略…

JavaScript高级:原型和原型链

在 JavaScript 中,原型与原型链是一种强大的继承机制,它使对象之间能够共享属性和方法,从而实现高效的代码复用。虽然这听起来可能有些复杂,但是我们可以用通俗易懂的方式来理解这个概念。本文将为你详解原型和原型链的概念与作用…

win11虚拟机安装

win11虚拟机安装 下载虚拟机客户端安装客户端创建虚拟机下载 ISO切换root账号GNOME桌面 下载虚拟机客户端 版本是16.2.3 链接:https://pan.baidu.com/s/13c6XVWFbeQKbCnrlfxD8cA 提取码:qxdc 安装客户端 安装向导 点击下一步 接收条款,点…

C#小轮子:自动连续Ping网络地址

文章目录 前言Ping代码异步问题 前言 工作中,我们经常用到Ping这个指令,有时候我们需要Ping整个网段来查看这个网段上面有什么设备,哪些Ip地址是通的,这个时候就需要Ping指令 Ping 代码 我这个是批量Ping的代码,而…

Stable Diffusion WebUI安装和使用教程(Windows)

目录 下载Stable Diffusion WebUI运行安装程序,双击webui.bat界面启动插件安装(github)模型下载(有些需要魔法)安装过程遇到的大坑总结参考的博客 整个过程坑巨多,我花了一个晚上的时间才全部搞定,本教程针对有编程基础…

Ctfshow web入门 SSTI 模板注入篇 web361-web372 详细题解 全

CTFshow SSTI web361 笔记分享 一、代码块 变量块 {{}} 用于将表达式打印到模板输出 注释块 {##} 注释 控制块 {%%} 可以声明变量,也可以执行语句 {% for i in .__class__.__mro__[1].__subclasses__() %}{% if i.__name___wrap_close %}{% print i.__init__.…

面试热题(反转链表)

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 链表的题&#xff0c;大部分都可以用指针或者递归可以做&#xff0c;指针如果做不出来的话&#xff0c;…

adb 通过wifi连接手机

adb 通过wifi连接手机 1. 电脑通过USB线连接手机2. 手机开启USB调试模式&#xff0c;开启手机开发者模式3.手机开启USB调试模式 更多设置-》开发者选项-》USB调试4.点击Wi-Fi 高级设置&#xff0c;可以查看到手机Wi-Fi的IP地址&#xff0c;此IP地址adb命令后面的ip地址&#xf…

竞赛项目 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

【办公软件】WPS2019打开时报错:安装Office自定义项,安装期间出错

文章目录 一、报错信息二、解决方法&#xff1a; 三、原因 一、报错信息 二、解决方法&#xff1a; 1.按一下左下角【开始】按钮&#xff0c;点击【运行】&#xff0c;在对话框输入【regedit】打开注册表 2.按CtrlF查找【YdWordAddIn.vsto】 3.删除【Manifest】下的数据 (如…

flutter引入高德地图,release 版本闪退问题解决

前提是在确定了闪退是由于地图引起的之后。报错内容如下 1、检查高德开放平台&#xff0c;查看参数是否正确配置&#xff0c;SHA1 和包名是否正确。配置 SHA1 可参考获取 Android 的 SHA1 值_LoveShadowing的博客-CSDN博客 2、检查是否引入 sdk&#xff0c;是否配置混淆&#…

痞子衡嵌入式:AppCodeHub - 一站网罗恩智浦MCU应用程序

近日&#xff0c;恩智浦官方隆重上线了应用程序代码中心(Application Code Hub&#xff0c;简称 ACH)&#xff0c;这是恩智浦 MCUXpresso 软件生态的一个重要组成部分。痞子衡之所以要如此激动地告诉大家这个好消息&#xff0c;是因为 ACH 并不是又一个恩智浦官方 github proje…

k8s集群网络插件搭建——————解决集群notready(k8s1.20版本,docker24)

前面已经提到&#xff0c;在初始化 k8s-master 时并没有网络相关配置&#xff0c;所以无法跟 node 节点通信&#xff0c;因此状态都是“NotReady”。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。 那么&#xff0c;这个时候我们该怎么办呢&#xff1f;…

微信小程序备案流程

微信小程序备案流程 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮我…

基于Promise.resolve实现Koa请求队列中间件

本文作者为360奇舞团前端工程师 前言 最近在做一个 AIGC 项目&#xff0c;后端基于 Koa2 实现。其中有一个需求就是调用兄弟业务线服务端 AIGC 能力生成图片。但由于目前兄弟业务线的 AIGC 项目也是处于测试阶段&#xff0c;能够提供的服务器资源有限&#xff0c;当并发请求资源…

uniapp 扩展组件 uni-forms 的表单验证之 validateFunction 只响应一次

uniapp 扩展组件 uni-forms 的表单验证之 validateFunction 只响应一次 问题代码官方说明参考资料 问题代码 直接从官方示例中复制过来改的。为了演示 <template><view><uni-forms ref"form" :modelValue"formData" :rules"rules&qu…

vue-pc端实现按钮防抖处理-自定义指令

前言 我们经常在移动端会处理按钮和输入框的防抖和节流处理&#xff0c;在pc端很少进行这样的操作 但是在pc端也是可以进行按钮的防抖操作&#xff0c;这样也是比较合理&#xff0c;可以不用但不可以不会 我们只要配合vue项目自定义指令加上全局注册&#xff0c;就可以实现按…