微信朋友圈千亿访问量背后的技术挑战和实践总结

简介: 微信朋友圈千亿访问量背后的技术挑战和实践总结

1、前言

微信朋友圈包括图片和视频两套业务架构组成,朋友圈图片的特点是请求量大、消耗计算资源较多,视频则主要消耗带宽。朋友圈的数据是永远存储的,而且随着业务的快速发展,存储容量、带宽和设备的消耗大量增加,尤其重大节日带来的使用量增长,更加剧了消耗,也给运维人员的保障带来了巨大压力。

在重在节假日节点,技术保障主要由三方面组成:

  • 1)软件保障指通过程序、业务逻辑层面的优化和评估,减轻负载;
  • 2)硬件保障主要指带宽、机器负载的评估和扩容;
  • 3)柔性措施指的是通过业务调整,降低一些不重要特性的资源,来保障重点特性的正常运行。

2、相关文章

《微信朋友圈海量技术之道PPT [附件下载]》

《架构之道:3个程序员成就微信朋友圈日均10亿发布量[有视频]》


3、软件架构方面的保障

朋友圈整体情况如下图所示:

image.png

朋友圈的架构主要分为OC和IDC两种:

  • IDC指的是数据中心,即数据最终落地存储的地方;
  • OC指的是带外网的独立机房,SOC指规模较大的OC。

每个IDC都有一整套接口机/逻辑设备/存储设备用以支撑用户的上传下载、及文件落地存储的需求。

OC点的主要作用是提供外网访问,承载用户的下载流量。每个OC内的设备,一起组成一个缓存池,用户下载时,本地OC中缓存不命中,才到IDC去回源拉取文件。每个OC的功能都是相同的,用户一般到就近的OC点下载,当单个OC点故障时,会通过重试或者切换让用户到其他OC点下载,确保下载成功。

4、容灾及重试机制

朋友圈的模块容灾主要是实现单机故障时的自动剔除,主要形式是通过master管理服务器的ip列表,通过心跳探测等方式找到异常设备,并屏蔽故障ip,不返回给前端使用。

以front层的单机剔除为例:

image.png

如果整个OC或IDC点碰到故障,由于变动较大,一般依赖运维人员手工切换来恢复,或者通过模块之间的重试机制来保障。

朋友圈下载的重试:

image.png

不管是用户到OC的下载过程,还是OC到IDC的回源过程,默认都会进行2次失败后的重试,并且重试一定会选择异地的接入点,避免继续重试到故障的节点。实现的原理是每一层master都会返回给前端至少两组ip列表,并保证两组ip列表为异地节点,前端失败时才可以实现异地重试。

但重试由于会造成请求的增加,所以是把双刃剑,节日高峰期间由于请求本身涨幅已经很高,重试更容易引发问题,需要进行调整:

  • 1)通过master路由下发,关闭重试。
    在元旦/春节这种请求有数倍增长的节日实行;
  • 2)值班人员严密监控,如果IDC失败率超过20%,则紧急手工关闭重试。
    这种在中秋/国庆这种增长并不高的节日实行。

Front模块的重试控制界面:

image.png

5、硬件方面的保障


5.1容量评估和设备扩容

重要节日前运维人员会连同资源组,根据业务预算和业务增长的需求及实际负载,进行各个机房、模块的设备扩容。预算以外的请求上涨,则通过柔性或者过载的方式,进行降低或者拒绝。

评估方法:

  • 1)机房容量主要根据交换机带宽的上限评估;
  • 2)接入层设备容量主要根据CPU、内存的负载比例、网卡的流量/包量占比来评估;
  • 3)存储层设备容量主要根据CPU、内存的负载比例、磁盘IO的读写次数来评估。


5.2春节朋友圈上传负载

image.png

业务侧春节要求的增长比例,是上传支持9倍增长,下载支持1倍增长,超过这个比例的请求可以拒绝掉,但根据预算扩容后,达到上图的效果,还是有部分模块无法支持这个涨幅,尤其是压缩compress模块,该模块每支持一倍增长就需要大量虚拟机扩容,预算内无法支持,这样就需要使用柔性策略来解决。

6、柔性策略简介

朋友圈的柔性策略分为两层:

  • 第一层是粗暴柔性:即按比例、接业务直接限制上传下载的请求,被限制的请求会返回给用户失败,与微信C2C相同,这种一般用于超过系统预估的负载能力,造成系统故障时用于快速恢复业务时使用;

第二层是按业务特性柔性:即从业务层面通过降低图片视频清晰度、延迟用户更新等方向降低系统的负载。
下面主要详述业务柔性。
image.png

朋友圈业务的主要增长与瓶颈:从前文的设备负载评估图看,在预算范围内,接入层和逻辑层都只能支撑5倍增长,而压缩compress模块只能支撑1倍增长。

7、柔性实践之:压缩compress柔性

Compress模块的作用是将客户端上传来的原始图片按需求压缩成各种格式和尺寸,以支持特定的业务场景,并且节省存储空间和带宽。由于压缩技术的不断发展,使用更先进的压缩格式,同等清晰度的图片压缩比例越高,需要消耗的压缩计算资源就越多。

image.png

所以如果反向操作,将当前使用的hevc格式替换回jpeg格式存储的话,就可以节省压缩资源,实测compress的cpu负载可以降为20%,即支持5倍增长。但图片的平均大小也会上涨,造成下载流量上涨。

所以采用的折衷方法,是在上传图片换回jpeg格式的同时,将图片的清晰度从70降为50,这样可以减小文件平均大小,从而抵消换回jpeg格式带来的流量上涨效果。实际测试中,发现用户对降清晰度的感知并不明显,在节假日短暂开启不会影响用户体验。

8、柔性实践之:小视频码率柔性

小视频的带宽平时会超过1TB,节日效应增长明显。所采取的降流量方法与图片类似,即降低上传视频的码率,通过降低文件平均大小的方法来节省带宽。

柔性:小视频码率1800 -> 1200 平均大小 2.1MB -> 1.3MB

经测试,降码率后基本不会影响用户体验,但由于是对新上传视频生效,要体现到下载带宽的下降中,就有相当程度的延迟,大约需要4小时完全生效。所以这一柔性措施在节日之前就需要开启,不能用于应付紧急情况。

降码率生效期间流量变化:

image.png

9、柔性实践之:上传TSSD缓冲池柔性

image.png

由于上传preupload接口机及后层的逻辑模块等,都无法支持10倍涨幅。所以在架构中另外搭建了两套TSSD缓冲池,缓冲池用于临时存储新上传的文件,可以支持读写。按上图所示,在zone模块处增加了缓冲池一,在上传preupload处,增加了缓冲池二。两个缓冲池的作用是有区别的:

zone模块如果过载,主动过载掉的上传请求,不会直接返回失败,而是将请求写入到缓冲池一中,缓冲池一中的文件并不能被下载到,但会按比较慢的速度将文件下发,写入到后端模块。所以缓冲池一的主要作用是减缓短时间内大量的上传请求,而不是完全抵消上传请求,并且缓冲池一中的文件是不能被下载到的。

在preupload模块处增加了缓冲池二,preupload模块中对存储TFS的写请求次数做了限制,如果上传请求数超过了存储TFS的能力,则preupload会将请求写入缓冲池二。用户下载时,会根据文件标识进行判断,如果发现文件存储在缓冲池二而不是TFS中,则会到缓冲池二中去获取文件。所以缓冲池二可以替代TFS的功能,起到保护底层模块的效果。等到缓冲池二下架时,需要将其中的文件人工写入到TFS中。

10、柔性实践之:朋友圈timeline按比例柔性

timeline指的是微信朋友圈更新的时间戳,这一柔性的原理是将通知用户好友朋友圈更新的时间戳先缓存起来,不下发给用户的微信终端,这样微信上就看不到朋友圈更新的内容了,也就不会产生下载图片/视频的请求,可以直接减少下载流量。

timeline柔性后这里不会更新了:

image.png

但也有几点注意事项:

  • 1)容易引起用户投诉,用户一般会明显感知到朋友圈内容变少了;
  • 2)如果缓存timeline的时间过久,将缓存下发的过程就必须很慢,否则会引起下载流量的进一步暴涨。

春节人工执行柔性的步骤:

image.png


目录
相关文章
|
4月前
|
小程序
跨端技术问题之为什么在微信小程序中静态转义出didUpdate生命周期可靠程度低
跨端技术问题之为什么在微信小程序中静态转义出didUpdate生命周期可靠程度低
|
6天前
|
存储 监控 算法
社交软件红包技术解密(三):微信摇一摇红包雨背后的技术细节
本文将由微信团队工程师张文瑞分享微信春节摇一摇红包技术背后的方方面面,希望能给同行们带来启发。
22 1
|
2月前
|
存储 监控 容灾
微信技术总监谈架构:微信之道——大道至简(演讲全文)
在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。 周颢把微信的成功归结于腾讯式的“三位一体”策略:即产品精准、项目敏捷、技术支撑。微信的成功是在三个方面的结合比较好,能够超出绝大多数同行或对手,使得微信走到比较前的位置。所谓产品精准,通俗的讲就是在恰当的时机做了恰当的事,推出了重量级功能,在合适的时间以最符合大家需求的方式推出去。他认为在整个微信的成功中,产品精准占了很大一部分权重。
59 1
微信技术总监谈架构:微信之道——大道至简(演讲全文)
|
30天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
50 5
|
2月前
|
程序员 数据库 UED
微信也在用的消息时序性技术,你知道多少?
本文由程序员小米撰写,探讨了在个人项目中如何保证消息的时序性。文章详细介绍了消息时序性的概念及其重要性,并提出了三种方案:ID设计(借鉴微信号段与跳跃式生成)、单聊场景下的单点序列化同步,以及群聊场景中的单点序列化处理。此外,还提供了多种优化方法,如消息时序对齐、本地时序记录等,帮助读者更好地解决消息乱序问题。适合所有关心即时通讯和社交应用技术细节的开发者阅读。
45 4
|
3月前
|
人工智能 自然语言处理 Serverless
阿里云百炼应用实践系列-让微信公众号成为智能客服
本文主要介绍如何基于百炼平台快速在10分钟让您的微信公众号(订阅号)变成 AI 智能客服。我们基于百炼平台的能力,以官方帮助文档为参考,让您的微信公众号(订阅号)成 为AI 智能客服,以便全天候(7x24)回应客户咨询,提升用户体验,介绍了相关技术方案和主要代码,供开发者参考。
阿里云百炼应用实践系列-让微信公众号成为智能客服
|
3月前
|
存储 人工智能 API
阿里云百炼应用实践系列-10分钟在企业微信中集成一个 AI 助手
在阿里云平台上,您只需十分钟,无需任何编码,即可在企业微信上为您的组织集成一个具备大模型能力的AI助手。此助手可24小时响应用户咨询,解答各类问题,尤其擅长处理私域问题,从而成为您企业的专属助手,有效提升用户体验及业务竞争力。
|
3月前
|
小程序 前端开发 JavaScript
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。开发者运用Service Worker等实现资源缓存与实时推送,利用Web App Manifest添加快捷方式至桌面,通过CSS3和JavaScript打造流畅动画与手势操作,需注意兼容性与性能优化,为用户创造更佳体验。
89 0
|
4月前
|
安全 API Windows
支付系统13------支付系统的资料在技术库里的在线支付当中,怎样获取微信平台证书那?怎样获取微信平台证书那?第一步打开我们的微信支付平台的文档中心
支付系统13------支付系统的资料在技术库里的在线支付当中,怎样获取微信平台证书那?怎样获取微信平台证书那?第一步打开我们的微信支付平台的文档中心
|
5月前
|
XML 小程序 前端开发
技术心得记录:微信小程序开发的基本流程
技术心得记录:微信小程序开发的基本流程
56 0