学习
实践
活动
专区
工具
TVP
写文章
专栏首页【腾讯云开发者】国民级应用:微信是如何防止崩溃的?

国民级应用:微信是如何防止崩溃的?

导读 | 微信作为月活过10亿的国民级应用,经常面临特殊节点消息量暴增的问题,服务很容易出现过载。但微信的服务一直比较稳定,是如何做到的呢?本文邀请到了腾讯WXG后开开发工程师alexccdong以微信 2018 年发表于Socc会议上的文章《Overload Control for Scaling Wechat Microservices》 为基础,介绍微信大规模微服务的过载保护策略,其中很多方法很有借鉴意义。欢迎继续阅读。

过载保护基本概念

1)什么是服务过载?

服务过载就是服务的请求量超过服务所能承受的最大值,从而导致服务器负载过高,响应延迟加大。用户侧表现就是无法加载或者加载缓慢。这会引起用户进一步的重试,服务一直在处理过去的无效请求,导致有效请求跌 0,甚至导致整个系统产生雪崩。

2)为什么会发生服务过载?

互联网天生就会有突发流量。秒杀、抢购、突发大事件、节日甚至恶意攻击等,都会造成服务承受平时数倍的压力。微博经常出现某明星官宣结婚或者离婚导致服务器崩溃的场景,这就是服务过载。

3)过载保护的好处

提升用户体验、保障服务质量。在发生突发流量时仍然能够提供一部分服务能力,而不是整个系统瘫痪,系统瘫痪就意味着用户流失、口碑变差、夫妻吵架甚至威胁生命安全(例如提供医疗资源协调服务的app)。

微信中的过载场景

微信采用的是微服务。微服务采用统一的 RPC 框架搭建一个个独立的服务,服务之间互相调用,实现各种各样的功能,这也是现代服务的基本架构。毕竟谁也不想看到自己朋友圈崩掉导致聊天功能也无法正常使用。

微信的服务是分三层:接入服务、逻辑服务、基础服务。大多数服务属于逻辑服务,接入服务如登录、发消息、支付服务,每日请求量在 10 亿-100 亿之间,入口协议触发对逻辑服务和基础服务更多的请求,核心服务每秒要处理上亿次的请求。

在大规模微服务场景下,过载会变得比较复杂。如果是单体服务,一个事件只用一个请求。但微服务下,一个事件可能要请求很多的服务,任何一个服务过载失败,就会造成其他的请求都是无效的。如下图所示:

比如在一个转账服务下,需要查询分别两者的卡号,再查询 A 时成功了,但查询B失败,对于查卡号这个事件就算失败了,比如查询成功率只有 50%,那对于查询两者卡号这个成功率只有 50% * 50% = 25% 了,一个事件调用的服务次数越多,那成功率就会越低。

如何判断过载

通常判断过载可以使用吞吐量、延迟、CPU 使用率、丢包率、待处理请求数、请求处理事件等等。微信使用在请求在队列中的平均等待时间作为判断标准,就是从请求到达,到开始处理的时间。

为啥不使用响应时间?因为响应时间是跟服务相关的,很多微服务是链式调用,响应时间是不可控的,也是无法标准化的,很难作为一个统一的判断依据。

那为什么不使用 CPU 负载作为判断标准呢?因为 CPU 负载高不代表服务过载,一个服务请求处理及时,CPU 处于高位反而是比较良好的表现。实际上 CPU 负载高,监控服务是会告警出来,但是并不会直接进入过载处理流程。

腾讯微服务默认的超时时间是 500ms,通过计算每秒或每 2000 个请求的平均等待时间是否超过 20ms,判断是否过载,这个 20ms 是根据微信后台 5 年摸索出来的门槛值。

采用平均等待时间还有一个好处是这个是独立于服务的,可以应用于任何场景,而不用关联于业务,可以直接在框架上进行改造。

当平均等待时间大于 20ms 时,以一定的降速因子过滤调部分请求。如果判断平均等待时间小于 20ms,则以一定的速率提升通过率。一般采用快降慢升的策略,防止大的服务波动。整个策略相当于一个负反馈电路。

过载保护策略

一旦检测到服务过载,需要按照一定的策略对请求进行过滤。前面分析过,对于链式调用的微服务场景,随机丢弃请求会导致整体服务的成功率很低。所以请求是按照优先级进行控制的, 优先级低的请求会优先丢弃。

1)业务优先级

对于不同的业务场景优先级是不同的。比如登录场景是最重要的业务,不能登录一切都白费。支付消息也比普通消息优先级高,因为用户对金钱是更敏感的。但普通消息又比朋友圈消息优先级高。所以在微信内是天然存在业务优先级的。

用户的每个请求都会分配一个优先级。在微服务的链式调用下,下游请求的优先级也是继承的。比如我请求登录,那么检查账号密码等一系列的的后续请求都是继承登录优先级的,这就保证了优先级的一致性。

每个后台服务维护了业务优先级的hash表。微信的业务太多,并非每个业务都记录在表里,不在表里的业务就是最低优先级。

2)用户优先级

很明显,只基于业务优先级的控制是不够的。首先不可能因为负载高,丢弃或允许通过一整个业务的请求。每个业务的请求量很大,那一定会造成负载的大幅波动。另外如果在业务中随机丢弃请求,在过载情况下还是会导致整体成功率很低。

解决这个问题可以引入用户优先级。首先用户优先级也不应该相同,对于普通人来说通过 hash 用户唯一 ID,计算用户优先级,为了防止出现总是打豆豆的现象,hash 函数每小时更换,跟业务优先级一样,单个用户的访问链条上的优先级总是一致的。

为啥不采用会话 ID 计算优先级呢?从理论上来说采用会话 ID 和用户 ID 效果是一样的。但是采用会话 ID 在用户重新登录时刷新,这个时候可能用户的优先级可能变了,在过载的情况下,可能因为提高了优先级就恢复了。这样用户会养成坏习惯,在服务有问题时就会重新登录,这样无疑进一步加剧了服务的过载情况。

引入了用户优先级,那就和业务优先级组成了一个二维控制平面。根据负载情况,决定这台服务器的准入优先级(B,U),当过来的请求业务优先级大于 B,或者业务优先级等于 B,但用户优先级高于 U 时,则通过,否则决绝。

3)自适应优先级调整

在大规模微服务场景下,服务器的负载是变化非常频繁的,所以服务器的准入优先级是需要动态变化的。微信分了几十个业务优先级,每个业务优先级下有 128 个用户优先级,所以总的优先级是几千个。

如何根据负载情况调整优先级呢?最简单的方式是从右到左遍历,每调整一次判断下负载情况,这个时间复杂度是 O(n), 就算使用二分法,时间复杂度也为 O(logn)。在数千个优先级下,可能需要数十次调整才能确定一个合适的优先级,每次调整好再统计优先级,可能几十秒都过去了,这个方法无疑是非常低效的。

微信提出了一种基于直方图统计的方法快速调整准入优先级,服务器上维护者目前准入优先级下,过去一个周期的(1s 或 2000 次请求)每个优先级的请求量,当过载时,通过消减下一个周期的请求量来减轻负载,假设上一个周期所有优先级的通过的请求总和是N。下一个周期的请求量要减少N*a,怎么去减少呢?每提升一个优先级就减少一定的请求量,一直提升到减少的数目大于目标量,恢复负载使用相反的方法,只不是系数为b,比a小,也是为了快降慢升。根据经验值a为 5%,b为1%。

为了进一步减轻过载机器的压力,能不能在下游过载的情况下不把请求发到下游呢?否则下游还是要接受请求、解包、丢弃请求,白白浪费带宽也加重了下游的负载。

为了实现这个能力,在每次请求下游服务时,下游把当前服务的准入优先级返回给上游,上游维护下游服务的准入优先级,如果发现请求优先级达不到下游服务的准入门槛,直接丢弃,而不再请求下游,进一步减轻下游的压力

总结

微信整个负载控制的流程如图所示:

当用户从微信发起请求,请求被路由到接入层服务,分配统一的业务和用户优先级,所有到下游的字请求都继承相同的优先级。根据业务逻辑调用1个或多个下游服务。当服务收到请求,首先根据自身服务准入优先级判断请求是接受还是丢弃。服务本身根据负载情况周期性的调整准入优先级。当服务需要再向下游发起请求时,判断本地记录的下游服务准入优先级。如果小于则丢弃,如果没有记录或优先级大于记录则向下游发起请求。下游服务返回上游服务需要的信息,并且在信息中携带自身准入优先级。上游接受到返回后解析信息,并更新本地记录的下游服务准入优先级。

整个过载保护的策略有以下三个特点:第一,业务无关的,使用请求等待时间而不是响应时间来制定用户和业务优先级,这些都与业务本身无关。第二,独立控制和联合控制结合,准入优先级取决于独立的服务,但又可以联合下游服务的情况,优化服务过载时的表现。第三,高效且公平。请求链条的优先级是一致的,并且会定时改变hash函数调整用户优先级。过载情况下,不会总是影响固定的用户。

你可能感兴趣的腾讯工程师作品

| 由浅入深读透vue源码:diff算法

| 优雅应对故障:QQ音乐怎么做高可用架构体系?

| QQ浏览器是如何提升搜索相关性的?

从Linux零拷贝深入了解Linux-I/O

技术盲盒:前端后端AI与算法运维工程师文化

后台回复“微信”,领本文作者推荐参考资料。

文章分享自微信公众号:
云加社区

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:腾讯程序员
原始发表时间:2023-01-10
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 月活 12.8 亿的微信是如何防止崩溃的?

    作者:alexccdong,腾讯 WXG 后开开发工程师 一、背景 最近在研究过载保护,微信是一个国民级的应用,月活用户过 10 亿,而且经常过年过节消息量暴增...

    腾讯技术工程官方号
  • 微信团队分享:iOS版微信是如何防止特殊字符导致的炸群、APP崩溃的?

    相信大家都遇到过一段特殊文本可以让iOS设备所有app闪退的经历。前段时间大年初一,又出现某个印度语字符引起iOS11系统奔溃,所幸iOS版微信客户端做了保护并...

    JackJiang
  • 微信团队分享:微信后台在海量并发请求下是如何做到不崩溃的

    本文引用了文章“月活 12.8 亿的微信是如何防止崩溃的?”和论文“Overload Control for Scaling WeChat Microservi...

    JackJiang
  • 揭秘:微信 / 微博 / 头条 / 快手是如何轻松处理亿级规模的 Feed 流的?

    差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动互联网时代的新产...

    iMike
  • 奔走相告!登机忘记带身份证 刷个“二维码”就能行

    你有过起了个大早赶到机场,却忘带身份证的”悲惨”经历吗? 当时的你有以下几种选择: A.时间允许的情况下,请家人快马加鞭送到机场。(p.s.这条不适合单身狗 ...

    腾讯大讲堂
  • 微信红包后台系统设计

    微信作为一款国民应用,已经进入每个互联网用户手中,微信支付作为其杀手级功能,在每一次佳节期间都会产生巨大流量,以2017年除夕为例,峰值QPS在76w左右,整个...

    春哥大魔王
  • 继小程序之后“小游戏”也来了,微信为此再次开启神秘入口

    相信昨天下午开始你也被「微信小游戏」刷屏了,只要你的微信更新到「6.6.1」版本,然后在搜索栏里检索「小游戏」就可以开启这个新功能。 「不会挤占你手机内存的,但...

    企鹅号小编
  • 字节跳动估值超过3400亿?今日头条和抖音成国民级应用

    大家可能都知道今日头条或抖音,但是不一定听说过字节跳动。可以告诉大家的是,字节跳动是今日头条、抖音、西瓜视频等众多国民级应用背后的母公司。这家公司的掌舵人就是张...

    光荣与梦想1987
  • 微信团队分享:iOS版微信的高性能通用key-value组件技术实践

    本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称MMKV)。

    JackJiang
  • 微博什么技术啊……还说支持八个明星并发出轨,结果…

    为什么我头脑一瞬间出现的是张靓颖,作为一个码农,技术宅,拼音缩小都是 ZLY,博主我真有点傻傻分不清楚了。。

    Java技术栈
  • 企业案例丨康师傅饮品借力微信云托管,玩转春节表情雨营销

    对于各大食品饮料品牌,新春佳节是不容错过的超级旺季。借势春节节点,品牌不仅可以拉近与用户的距离,建立有亲和力的品牌形象,还能够直接地拉动销售转化,为品牌带来生意...

    腾讯云开发TCB
  • 直播即将开始|PerfDog创始人Awen邀您共话移动产品质量管理之道

    今晚20:00,腾讯WeTest质量云平台首场技术专题直播《十年磨一剑,匠心铸造PerfDog》将于【腾讯WeTest】视频号开播。直播即将开始,点击下方链接,...

    WeTest质量开放平台团队
  • 2021 腾讯技术十大热门文章

    今天是 2021 年的最后一天,相信这依然是让我们每个人都印象深刻的一年。全年我们一共发布了 130+ 篇头条技术干货文章,阅读量超过百万。 2021腾讯技术...

    腾讯技术工程官方号
  • 【企鹅智酷最新报告】微信2017用户研究和商机洞察

    8.89亿月活跃用户,近一年来直接带动信息消费1742.5亿元——经过六年的高速发展,微信已经成为了中国移动互联网的国民级应用。 但在这些“看得到的数据”背后,...

    钱塘数据
  • 这个H5页面,让你重新认识微信

    昨天有微信的朋友发了一个H5页面给我(阅读原文有链接),让我友情转发下,H5我见了很多,不过微信做H5页面在自家阵地朋友圈传播内容,还是挺有意思的。看了内容,还...

    罗超频道
  • 这一次,我们发现了一个全新的微信

    8.89亿月活跃用户,近一年来直接带动信息消费1742.5亿元——经过六年的高速发展,微信已经成为了中国移动互联网的国民级应用。 但在这些“看得到的数据”背后,...

    腾讯大讲堂

扫码关注腾讯云开发者

领取腾讯云代金券