oom 如何避免 高并发_微博短视频百万级高可用、高并发架构如何设计?

本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。

d14317dfc132cba5e24f44431159ba24.png

今天与大家分享的是微博短视频业务的高并发架构,具体内容分为如下三个方面:

  • 团队介绍
  • 微博视频业务场景
  • “微博故事”业务场景架构设计

团队介绍

bb00b78966c0bd67623ed608ca952522.png

我们是隶属于微博研发部视频平台研发部门的技术团队。平台研发是微博的核心部门之一,包括大家熟知的微博视频在内的微博所有核心业务的基础平台架构、用户关系体系等都依赖微博平台研发部门的技术支持。

我们的团队主要负责与视频相关的上层业务也就是视频微博、“微博故事”以及短视频和直播,其中直播包括常规的直播与直播答题等新玩法。

同时我们还负责底层视频平台的架构搭建,包括文件平台、转码平台、配置调度中心与媒体库。

我们致力于用技术帮助微博从容应对每天百万级的视频增量与其背后多项业务的多种定制化需求。

微博视频业务场景

12f705b75c52285d748f1ea00a84ff87.png

我们的业务场景主要是应对热门事件的流量暴涨,例如明星绯闻、爆炸性新闻等势必会让流量在短时间内急剧增长的事件。

如何从架构上保证流量暴涨时整体平台的稳定性?如果只是简单地通过调整服务器规模解决,流量较小时过多的服务器冗余带来成本的浪费,流量暴涨时过少的服务器又令平台服务处于崩溃的边缘。

比较特别的是,我们面临的问题与诸如“双十一”这种在某一确定时间段内流量的可预见式高并发有着本质的不同,我们面临的流量暴涨是不可预见的。因此通过哪些技术手段来妥善解决以上问题,将是接下探讨的重点。

62e105d7f160fbedb041f81ec84f011a.png

以上是基于微博的过去已经公开数据量级,非近期内部数据。微博视频是一个多业务接入的综合平台,你可以在微博上看见现在市面上的各种玩法。

这就导致我们即将面临的并不是某个垂直业务领域的命题,而是一个构建在庞大体量下的综合性命题,这就导致现有的通用技术框架无法妥善解决我们所面临的难题。

因为一些开源方案无法顺利通过技术压测,所以我们只能在开源方案的基础上进行自研与优化才能得到符合微博应用场景需求的技术解决方案。

183c8269845f3405289b94ff26cb4be1.png

微博的短视频业务被称为“微博故事”,上图展示的是“微博故事”的展现形态。这是一个布置在微博首页一级入口上的模块,主要展示的是用户关注的人所上传的 15 秒内的短视频。

我们希望强调其“即时互动”的属性,视频只有 24 小时的有效展示时间。不同用户的视频按照时间轴在上方排序,多个视频可依次观看、评论、点赞等。

“微博故事”业务场景架构设计

微服务架构

87e1b5c3e7e7e98e68035d2385df3d47.png

上图展示的是这项业务的微服务架构:在接口层我们混布了 Web API 与内部的 RPC 请求。

在这里我们并未集成具有实际意义的门面层,而接下来的服务层集成了许多微服务,每个微服务集中在一个垂直功能上并可对外提供接口,这里的门面层主要作用是聚合一些微服务并对外提供综合性接口。

除此之外还有一些依赖服务例如用户关注、也需要依赖于其他部门的 RPC 服务;最后的存储层则是集成了 Cache 与 db 的标准方案。

技术挑战

315ebc4e87e0dd71bfdb74cfef6a61c3.png

有人曾问到:微博短视频业务的高并发有多高?假设我关注了 500 名好友,如果有好友发布一个视频就会在“微博故事”头像列表上显示一个彩圈用以提示我去观看。

如果我想知道自己所有关注的 500 个人所发的视频内容,假设首页每秒刷新十万次,那么需要每秒钟五千万的 QPS。

除此之外我们还需要确定视频是否过期、视频发送顺序等,实际的资源层读取量将远远高于五千万。

方案比较

2e17f50e00f1f13efcc3db9cb3314273.png

在构建解决方案时我们思考:可以借鉴微博之前的 Feed 解决方案,我们不会进行无意义的重复性工作与思考。

即使短视频与 Feed 都具有首页刷新与关注人发布消息聚合的特点,但以用户列表为形式,强调进度续播与即时互动的短视频和以内容列表为形式,强调无阅读状态与永久保存的微博具有本质的区别。

面对一般的 Feed 应用场景可以使用以下两种模型:

  • Feed 推模型
  • Feed 拉模型

①Feed 推模型

c635efdf913bc04f87368156a459c911.png

Feed 推模型是指将用户上传发布的内容推送至每一位粉丝,这种方案具有很大的弊端。由于用户尚未达成一定规模,早期的微博以 Feed 推模型为主导。

而现在一个大 V 用户的粉丝数量普遍都是千万级别,如果依旧使用 Feed 推模型则意味着千万量级的内容推送,在难以保证千万份推送一致性的情况下,势必会为服务器带来巨大压力。

微博的业务强调的就是强时效性下的内容一致性,我们需要确保热点事件推送的瞬时与一致。

除了从技术层面很难确保千万级别内容推送的时效性与一致性,由于用户上线状态的不统一,为离线的用户推送强时效性的内容无疑是对服务器等资源的巨大浪费,为了避免以上麻烦我们必须改变思路。

②Feed 拉模型

a899b5d5783ea1d4e8afc8d39eae4d27.png
7c8e7d1bfa50450654b3a34802c85a37.png

Feed 拉模型:拉取关注的人并实时查询状态及内容。综合微博的庞大用户体量、数据写入开销与确保一致性三方面,我们决定选择 Feed 拉模型。

f00e15c165a49c19ad973f5fe11242c9.png

如何通过 Feed 拉模型应对如此规模庞大的 QPS?首先我们采用了分布式缓存架构,在缓存层集成了数据分片并将缓存通过哈希算法合理分片,之后再把缓存去切片化并进行存取。

分布式缓存架构

cd2122868c09021d3e69b6d9b138a632.png

其次我们使用了独有的多级缓存方案也就是 L1、 Master 、Slave 三层缓存方案。

L1 是一个热度极高容量极小的缓存,我们称其为“极热缓存”,其特点是便于横向扩展。

假设 L1 只有 200MB 缓存,我们使用 LRU 算法通过热度分析把访问最热的数据存储在 L1 中;之后的 Master 与 Slave 的缓存空间则是 4GB、6GB,比 L1 大很多倍。

因为微博的流量比较集中于热点事件中某几位明星或某个新闻,小容量的 L1 可进行快速扩容;在发生热门事件时利用云的弹性自动扩容从而分担热点事件短时间激增的流量压力。

由于自动扩容时 L1 仅占用每台缓存中很小的空间,扩容的速度就会非常快,通过这种手动或自动的瞬间弹性扩容来确保服务器稳定承受热点事件背后的数据激增量。

第二层的 Master 与 Slave 具有比 L1 大好多倍的缓存空间,主要用于防止数据冷穿。

虽然 L1 主要承担的是热点数据,但却无法确保一些短时间内不热但在某个时间段热度突然高涨所带来的流量短时间爆发时服务器的稳定性。

HA 多机房部署

b76bbab0224448d4c637809fd21c1ad6.png

而 Master 与 Slave 作为 L1 的逻辑分组可有效防止数据过冷,在这里我们采用的是 HA 多机房部署。

例如图中的的两台 IDC,我们称左边为 IDC-A,右边为 IDC-B。缓存层的 Master 与 Slave 是主从同步的关系,双机房的缓存互相主从同步。

这里的“互相主从同步”是指 IDC-A 的 MC 与 IDC-B 的 MC 之间进行双向同步互为主从。

因为在进行双机房部署时需要均衡两个机房的流量负载,在缓存层需要使用 LRU 算法进行热度分析。

如果我们将流量分为两份并传输至两个机房,通过每个机房的 IRU 算法得到的热度信息有一定失真。

如果我们在缓存层做相互同步后每个机房的 MC 都是一个全量的热度算法,那么两个机房的 L1 基本可实现同步计算得出的热度信息一定是准确的,只有保证热度信息的准确无误才能从容应对流量激增与整个系统的高可用性。

在这里需要强调的是,实际上我们在选型上使用的是 MC 而未使用 Redis。

MC 对于纯简单数据 Key,Value 的抗量远大于 Redis;MC 采用预分配内存的形式放置 Key,Value,也就是把内存分成若干组相同数据区域,实际上就是若干个数组。

这种特殊结构使其在数据定位数组寻址与读写上的速度非常快;这种结构的缺点是:一旦缓存的数据出现变动就会出现即使内存留有空余但数据依旧无法存储的现象。

由于这种问题的存在,MC 不适用于存储变动大、Value 跨度大、业务多变的数据。

而 Redis 作为单线程方案,一致性更好,但在超大规模简单 Key,Value 读取上速度比 MC 是要差很多的。

802c4063ad6b2ca54c1cc32f4eeb2544.png

除了上述方案之外,我们还采用了弹性扩缩容。实际应用中,基于成本的考量我们无法部署大量的服务器,于是我们采用了自研的 DCP 弹性扩缩容平台。

首先,我们的自有机房有一些共享机器资源可在特殊情况下动态弹性扩充以应对增加的流量压力。

当然,这部分机器的性能是有限的,当数据量超过一定阈值后我们就会接入阿里云并利用我们与阿里云的混合云 DCP 方式构建一层弹性软平台用于自动扩容承担流量压力。

除了弹性扩容我们同时也采用了定时扩容的逻辑,在每天晚高峰时段进行扩缩容从而确保整体服务的稳定性。之所以这么做,主要是为了在保证用户体验的前提下尽可能节约成本。

3dc52a89802f8d1cbbd9d07c8003fc53.png

需要强调的是,扩容对速度的要求十分严格。只有扩容的速度越快,流量峰值来临时可承受的数据量越大,才能确保整体服务的高可用,因而我们也在努力优化扩容的速度。

我们的 DCP 平台上也有晚高峰固定时段扩缩容与突发流量临时扩缩容,通过如流量监控等的自动化容量评估来判断服务器荷载,并通过自动化任务调度妥善解决突发流量对服务器的影响。

微服务熔断机制

09e20e0f2d95e8f727d51b39722f82bd.png

当然,为了保证服务器整体的健康与稳定,我们也在其中集成了微服务熔断机制,其原理类似于家用电表中的保险丝,可在过载的情况下迅速自动熔断。

系统会定期进行自我评估并确定每个服务的最大荷载,假设将熔断值定为 3000QPS,那么当 QPS 超过 3000、超时或异常时服务即会迅速熔断并关闭,从而确保其他资源的安全稳定。

通过这种框架级、细粒度的自动降级机制,系统失败隔离能力可被有效提高,避免了雪崩式的链式宕机事件的发生。在熔断的同时,自动扩容也会同步运行。

熔断之后系统会不断更新服务流量荷载,一旦扩容完成或者服务还能继续承受流量即可重新恢复工作,这种熔断机制同样也是为服务器扩容争取时间。

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

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

相关文章

免费都不管用,Win10升级在中国怎么就这么难?

天下没有免费的午餐,如果有,那也是限时免费。不过,被地摊光盘浸淫十多年的中国民众,这次却对微软的免费分外冷淡。 就在7月26日这天,距离Windows 10免费升级还剩下最后三天,微软发了一份怨念深重的声明——…

在非k8s 环境下 的应用 使用 Dapr Sidekick for .NET

在k8s 环境下,通过Operator 可以管理Dapr sidecar, 在虚拟机环境下,我们也是非常需要这样的一个管理组件,之前写的一篇文章《 在 k8s 以外的分布式环境中使用 Dapr》 里面介绍了一个案例Dapr case study: Man Group:ht…

sigmoid函数_常用的激活(激励)函数——深度学习笔记(建议收藏)

激活函数(又叫激励函数,后面就全部统称为激活函数)是模型整个结构中的非线性扭曲力,神经网络的每层都会有一个激活函数。那他到底是什么,有什么作用?都有哪些常见的激活函数呢?深度学习的基本原理就是基于人工神经网络…

江苏信息考试access_软考 信息处理技术员备考复习攻略

如何备考信息技术处理员?在上午题和下午题中哪些知识点是重点难点?以下整理了信息处理技术员相关信息,祝所有考生们都能顺利通过考试。1上午考试试题分析上午试题含盖了纲中的信息技术基本概念、信息处理技术知识、计算机系统基础知识、操作系…

.NET6之MiniAPI(三十):结束篇(附链接)

不知不觉来到了《.NET6之MiniAPI》的第三十篇,回顾之前的篇幅,主要涉及如下:HTTP请求,应答Request桂素伟,公众号:桂迹.NET6之MiniAPI(二):requestResponse桂素伟,公众号:…

xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验

影评许可证公众号[2019]第22期本栏目由“数据皮皮侠”独家呈献专场python爬虫实战——豆瓣电影get初体验2019.10.28 / 早上7点场 / 免费本期“栏目”的四大看点:1 如何爬取2 如何解析与提取3 如何解析json数据4 实战:爬取豆瓣影视信息1 如何爬取how to O…

商丘高中计算机考试成绩查询系统,2019商丘中考招生成绩查询时间及网站公布...

成绩发布:今年中招成绩满分仍为700分。7月8日,公布中招成绩。考生可以通过“商丘便民网”及手机APP客户端进行查询,也可以登陆省中招平台(http://zk.haedu.gov.cn)和商丘市基础教育公共服务平台(http://www.sqsedu.net…

双时隙的工作原理_OFDM调制技术原理是什么 OFDM调制实现原理介绍【图文】

无线通讯OFDM调制技术原理简介OFDM是现代宽带无线通信系统应用的技术。为了减少高数据率OFDM系统中各信道间影响带来的失真,引入循环前缀(CP)来消除码间干扰(ISI)。它将一个IFFT包的最后部分复制到OFDM符号序列的前端。注意,CP的长度必须长于色散信道的长…

Windows 11 新版 22593 发布:文件资源管理器全新主页,开始菜单图标优化

面向 Dev 和 Beta 频道的 Windows 预览体验成员,微软现已发布 Windows 11 预览版 Build 22593。主要变化1.微软为 Windows 11 文件资源管理器引入了全新的主页功能,集成了快速访问、收藏夹和最近使用的文件。2.Windows 11 “开始”菜单文件夹中的应用程序…

2015年最弱的密码,和最强的密码

网络安全公司SplashData如约发布了本年度最不安全的密码排行榜。这是他们连续第五年做这件事了。 根据2015年从各个渠道泄露出来的密码信息,最弱的密码被“123456”再次蝉联。这个“万年陈酿”的密码排名第一感觉毫无压力。 夺得第二名的是“password”。中国用户似…

ideaspringboot项目上传服务器_nuxt+pm2 自动化部署及打包后文件自动上传阿里云 oss

在读这篇文档时&#xff0c;希望你对 nuxt 及 pm2&#xff0c;有简单的了解nuxtpm2前期准备安装 pm2 及构建 nuxt$ npm i pm2 -g $ npx create-nuxt-app <项目名>ssh 密钥配置pm2 代码自动发布依赖于 git 工具&#xff0c;先将 ssh 密钥配置再你的代码仓库&#xff08;gi…

wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结

一、wait()、notify()、notifyAll()用法obj.wait()/obj.wait(long timeout)是Object中的方法&#xff0c;当线程调用wait()方法&#xff0c;当前线程释放对象锁&#xff0c;进入等待队列。obj.notify()/obj.nogifyAll()是Object中的方法&#xff0c;唤醒在此对象上wait()的单个…

怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...

今天学习了类、对象及相关知识&#xff0c;试着从内存角度分析三者关系&#xff0c;如果有不对的地方请指正首先得先介绍java中的三个内存区域&#xff1a;栈区用于存放该线程执行方法的信息&#xff08;实际参数、局部变量等&#xff09;。栈属于线程私有&#xff0c;不能实现…

pycharm提示your evalluation license has expired解决方法

安装pycharm&#xff0c;一段时间后提示your evalluation license has expired&#xff1a;打开pycharm--点击help--register--选中license server,输入license server address如图示即可 转载于:https://www.cnblogs.com/youtiaoge/p/7125070.html

【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)

摘要:案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。数据来自《SPSS for Windows 统计分析》。 目 录 问题一:选择那些变量进行聚类?——采用“R型聚类

python利用特征进行可视化样本显示_利用Python进行机器学习之特征选择

毫无疑问&#xff0c;解决一个问题最重要的是恰当选取特征、甚至创造特征的能力&#xff0c;这叫做特征选取和特征工程。对于特征选取工作&#xff0c;我个人认为分为两个方面&#xff1a;1)利用python中已有的算法进行特征选取。2)人为分析各个变量特征与目标值之间的关系&…

甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...

【摘要】2019年9月份计算机二级考试已经圆满结束&#xff0c;参加考试的小伙伴们已经迫不及待的想要知道成绩了吧&#xff0c;小编对2019年9月甘肃计算机二级考试成绩查询入口进行了整理&#xff0c;参加9月份考试的朋友们到时候记得按时查询成绩哦&#xff01;想要了解更多计算…

FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库

简介FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库从 .NET 和 .NET Core 发送电子邮件的最简单方法。将 Razor 用于电子邮件模板并使用 SendGrid、MailGun、SMTP 等进行发送Nuget包•FluentEmail.Core - 域模型•FluentEmail.Smtp - 通过 SMTP 服务器发送电子邮件•Flu…

安装MySql出现Error Nr.1045的解决办法

如图&#xff0c;最后一步出现这个错误框 这是因为上次安装过MySql&#xff0c;其用户数据在卸载的时候没有被删除掉&#xff0c;解决办法如下&#xff1a; 显示隐藏的文件夹&#xff0c;打开C盘&#xff0c;找到下图文件删除之 删除之后再安装一遍MySQL&#xff0c;就可以了转…

python网易云_用python爬虫爬取网易云音乐

标签&#xff1a; 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去。按键盘F12打开网页调试工具,点击Network就可以查看网络请求的相关信息&#xff0c;选择XHR&#xff0c;然后可以看…