您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

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

时间:2022-06-14 15:22:29  来源:腾讯技术工程  作者:

作者:alexccdong,腾讯 WXG 后开开发工程师

一、背景

最近在研究过载保护,微信是一个国民级的应用,月活用户过 10 亿,而且经常过年过节消息量暴增,服务很容易出现过载,但微信的服务一直比较稳定,他们是怎么做的呢?

本文以微信 2018 年发表于 Socc 会议上的文章,《Overload Control for Scaling Wechat Microservices》 为基础,介绍了微信大规模微服务的过载保护策略,其中很多方法很有借鉴意义。

下面是对这篇文章做的一些解读。

二、过载保护基本概念

1.什么是服务过载?

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

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

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

3.过载保护的好处

主要是为了提升用户体验,保障服务质量,在发生突发流量时仍然能够提供一部分服务能力,而不是整个系统瘫痪,系统瘫痪就意味着用户流失,口碑变差,夫妻吵架,甚至威胁生命安全(假如腾讯文档崩溃,这个文档正好用于救灾)。

三、微信中的过载场景

微信采用的是微服务,说是微服务,其实我理解就是采用统一的 RPC 框架搭建的一个个独立的服务,服务之间互相调用,实现各种各样的功能,这也是现代服务的基本架构。毕竟谁也不想看到我朋友圈崩了,导致我聊天也不行了。

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

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

 

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

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

 

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

四、如何判断过载

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

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

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

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

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

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

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

 

五、过载保护策略

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

1.业务优先级

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

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

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

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

 

2. 用户优先级

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

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

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

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

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

 

3.自适应优先级调整

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

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

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

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

 

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

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

六、总结

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

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

 

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

整个过载保护的策略有以下三个特点:

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


Tags:微信   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
微信偷偷更新!五大变化,这个功能终于大变样
昨晚小雷正和哔哥在微信上吹水,冷不丁地就瞅见微信设置那里多了个小红点。小雷定睛一看,发现不是别的提醒嗷,正是安卓微信8.0.49内测版本升级提醒。好家伙,用了这么多年的微信,这...【详细内容】
2024-04-18  Search: 微信  点击:(1)  评论:(0)  加入收藏
如何解决信息接收延迟问题,优化微信使用体验
在当今社会,微信已经成为我们日常生活中不可或缺的通讯工具。然而,有时候我们会遇到微信信息接收延迟的问题,这不仅影响了我们的沟通效率,还可能让我们错过一些重要信息。为了解...【详细内容】
2024-04-17  Search: 微信  点击:(1)  评论:(0)  加入收藏
分享几个微信节省空间的小技巧
在数字化时代,微信已经成为我们日常生活中不可或缺的通讯工具。它不仅方便我们与亲朋好友保持联系,也是工作沟通的重要平台。然而,随着时间的推移,微信聊天记录、图片、视频等数...【详细内容】
2024-04-16  Search: 微信  点击:(1)  评论:(0)  加入收藏
注意!这种微信群赶紧退
9.9元包年看剧加入推广还能挣钱日前,有网友在社交平台分享这种“赚钱新路子”社交平台上发布的“9.9元畅享看短剧”帖子。记者调查发现此项目为一条通过社交媒体收费进微信群...【详细内容】
2024-04-16  Search: 微信  点击:(7)  评论:(0)  加入收藏
速查微信聊天最频繁对象,情侣必备!
在如今数字化交流的时代,微信无疑是我们日常生活中使用最频繁的工具之一。无论是工作、学习还是娱乐,微信都陪伴在我们身边,成为我们沟通的重要桥梁。而在微信的众多功能中,聊天...【详细内容】
2024-04-12  Search: 微信  点击:(6)  评论:(0)  加入收藏
女人在微信上给你发这两个字,其实是想你了
情感的表达需借助书信,那一份份缓慢穿越时空的纸张,承载着承诺与深情,往往能够维系一段白头偕老的姻缘。而如今,随着科技的进步,爱情已不再依赖书信这种传统的沟通方式。我们有了...【详细内容】
2024-04-12  Search: 微信  点击:(7)  评论:(0)  加入收藏
微信好友“隐身”删除?轻松识别已删除好友新策略
在数字化的社交世界中,微信已然成为我们与朋友、亲人保持联系的重要纽带。然而,随着微信的广泛使用,一个问题也悄然而至:有时候,我们的微信好友列表中,可能隐藏着一些已经单方面删...【详细内容】
2024-04-11  Search: 微信  点击:(5)  评论:(0)  加入收藏
微信宣布打击租售微信账号行为:避免隐私泄露,成不法分子帮凶
IT之家 4 月 10 日消息,微信安全中心今日傍晚发文称,近期有部分用户利用微信社交功能,在朋友圈、微信群发布“闲置小号换零花钱”等租售微信账号的相关内容。IT之家从公告中获...【详细内容】
2024-04-11  Search: 微信  点击:(6)  评论:(0)  加入收藏
一招教你怎么对微信聊天记录进行保存
在数字化交流日益频繁的今天,微信作为我们日常生活中的重要沟通工具,承载了无数珍贵的对话和回忆。聊天记录中,无论是与亲朋好友的欢笑谈天,还是工作中的重要交流,都可能成为我们...【详细内容】
2024-04-10  Search: 微信  点击:(7)  评论:(0)  加入收藏
启用微信这两大功能,快速清理手机存储
随着微信成为我们日常生活中不可或缺的通讯工具,它的功能不断丰富,使用频率也日益增加。然而,频繁的使用往往会带来手机内存空间的压力。为了保持手机的流畅运行,我们需要定期对...【详细内容】
2024-04-10  Search: 微信  点击:(4)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(18)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(34)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(44)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(42)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(73)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(62)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(44)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(162)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(53)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(87)  评论:(0)  加入收藏
站内最新
站内热门
站内头条