欢迎你们前往腾讯云社区,获取更多腾讯海量技术实践干货哦~前端
做者:腾讯技术工程官方号后端
微信朋友圈包括图片和视频两套业务架构组成,朋友圈图片的特色是请求量大、消耗计算资源较多,视频则主要消耗带宽。朋友圈的数据是永远存储的,并且随着业务的快速发展,存储容量、带宽和设备的消耗大量增长,而重大节日带来的使用量增加,更加重了消耗,也给运维人员的保障带来了巨大压力。缓存
节日保障主要由三方面组成:软件保障指经过程序、业务逻辑层面的优化和评估,减轻负载;硬件保障主要指带宽、机器负载的评估和扩容;柔性措施指的是经过业务调整,下降一些不重要特性的资源,来保障重点特性的正常运行。服务器
朋友圈总体状况:微信
朋友圈的架构,主要分为OC和IDC两种,IDC指的是数据中心,即数据最终落地存储的地方,OC指的是带外网的独立机房,SOC指规模较大的OC。每一个IDC都有一整套接口机/逻辑设备/存储设备用以支撑用户的上传下载、及文件落地存储的需求。架构
OC点的主要做用是提供外网访问,承载用户的下载流量。每一个OC内的设备,一块儿组成一个缓存池,用户下载时,本地OC中缓存不命中,才到IDC去回源拉取文件。每一个OC的功能都是相同的,用户通常到就近的OC点下载,当单个OC点故障时,会经过重试或者切换让用户到其余OC点下载,确保下载成功。运维
朋友圈的模块容灾主要是实现单机故障时的自动剔除,主要形式是经过master管理服务器的ip列表,经过心跳探测等方式找到异常设备,并屏蔽故障ip,不返回给前端使用,以front层的单机剔除为例:测试
若是整个OC或IDC点碰到故障,因为变更较大,通常依赖运维人员手工切换来恢复,或者经过模块之间的重试机制来保障微信支付
朋友圈下载的重试:优化
不论是用户到OC的下载过程,仍是OC到IDC的回源过程,默认都会进行2次失败后的重试,而且重试必定会选择异地的接入点,避免继续重试到故障的节点。实现的原理是每一层master都会返回给前端至少两组ip列表,并保证两组ip列表为异地节点,前端失败时才能够实现异地重试。
但重试因为会形成请求的增长,因此是把双刃剑,节日期间因为请求自己涨幅已经很高,重试更容易引起问题,须要进行调整:
1.经过master路由下发,关闭重试。在元旦/春节这种请求有数倍增加的节日实行。
2.值班人员严密监控,若是IDC失败率超过20%,则紧急手工关闭重试。这种在中秋/国庆这种增加并不高的节日实行。
Front模块的重试控制界面:
容量评估和设备扩容:
节日前运维人员会连同资源组,根据业务预算和业务增加的需求及实际负载,进行各个机房、模块的设备扩容。预算之外的请求上涨,则经过柔性或者过载的方式,进行下降或者拒绝。
春节朋友圈上传负载:
业务侧春节要求的增加比例,是上传支持9倍增加,下载支持1倍增加,超过这个比例的请求能够拒绝掉,但根据预算扩容后,达到上图的效果,仍是有部分模块没法支持这个涨幅,尤为是压缩compress模块,该模块每支持一倍增加就须要大量虚拟机扩容,预算内没法支持,这样就须要使用柔性策略来解决。
朋友圈的柔性策略分为两层:
第一层是粗暴柔性,即按比例、接业务直接限制上传下载的请求,被限制的请求会返回给用户失败,与微信C2C相同,这种通常用于超过系统预估的负载能力,形成系统故障时用于快速恢复业务时使用。
第二层是按业务特性柔性,即从业务层面经过下降图片视频清晰度、延迟用户更新等方向下降系统的负载。下面主要详述业务柔性
朋友圈业务的主要增加与瓶颈:
从前文的设备负载评估图看,在预算范围内,接入层和逻辑层都只能支撑5倍增加,而压缩compress模块只能支撑1倍增加。
Compress模块的做用是将客户端上传来的原始图片按需求压缩成各类格式和尺寸,以支持特定的业务场景,而且节省存储空间和带宽。因为压缩技术的不断发展,使用更先进的压缩格式,同等清晰度的图片压缩比例越高,须要消耗的压缩计算资源就越多。
因此若是反向操做,将当前使用的hevc格式替换回jpeg格式存储的话,就能够节省压缩资源,实测compress的cpu负载能够降为20%,即支持5倍增加。但图片的平均大小也会上涨,形成下载流量上涨。
因此采用的折衷方法,是在上传图片换回jpeg格式的同时,将图片的清晰度从70降为50,这样能够减少文件平均大小,从而抵消换回jpeg格式带来的流量上涨效果。实际测试中,发现用户对降清晰度的感知并不明显,在节假日短暂开启不会影响用户体验。
小视频的带宽平时会超过1TB,节日效应增加明显。所采起的降流量方法与图片相似,即下降上传视频的码率,经过下降文件平均大小的方法来节省带宽。
柔性: 小视频码率1800 -> 1200 平均大小 2.1MB -> 1.3MB
经测试,降码率后基本不会影响用户体验,但因为是对新上传视频生效,要体现到下载带宽的降低中,就有至关程度的延迟,大约须要4小时彻底生效。因此这一柔性措施在节日以前就须要开启,不能用于应付紧急状况。
3.上传TSSD缓冲池柔性
因为上传preupload接口机及后层的逻辑模块等,都没法支持10倍涨幅。因此在架构中另外搭建了两套TSSD缓冲池,缓冲池用于临时存储新上传的文件,能够支持读写。按上图所示,在zone模块处增长了缓冲池一,在上传preupload处,增长了缓冲池二。两个缓冲池的做用是有区别的:
4.朋友圈timeline按比例柔性
timeline指的是微信朋友圈更新的时间戳,这一柔性的原理是将通知用户好友朋友圈更新的时间戳先缓存起来,不下发给用户的微信终端,这样微信上就看不到朋友圈更新的内容了,也就不会产生下载图片/视频的请求,能够直接减小下载流量。
但也有几点注意事项:
此文已由做者受权腾讯云技术社区发布,转载请注明原文出处