云服务过载控制的前世今生

摘要:服务过载在云时代是必然存在的,如何解决与应对成为了云服务开发、运营与运维的关键要素,通过过载场景现象、基础过载控制等能力,来应对出现的服务/应用过载。

本文分享自华为云社区《云服务过载控制的前世今生》,作者:SRE确定性运维 。

1.为什么会有过载?

过载,是服务或应用处理的请求超过了自身所能承载的能力,造成服务或应用自身处理请求时延变慢、错误率增加,或者请求失败,乃至服务中断。

云服务过载控制的前世今生

如上图,客户端与服务器通信的分布式系统中,客户端在等待一段时间后常常会变得不耐烦,并会停止等待服务器响应。这段时间称为超时时间。如果服务器因过载而导致其延迟超过客户端的超时值,请求会开始失败。图1显示服务器响应时间如何随着提交的吞吐量(以每秒事务数为单位)增加而延长,最终到达情况迅速恶化的转折点。

云服务过载控制的前世今生

如上图,当响应时间超过客户端超时值,可清楚看到情况很糟糕,但并未显示到底有多糟糕。可在延迟旁边画出客户端感知到的可用性,不使用常规的响应时间测量值,而是改用中值响应时间。中值响应时间表示50%的请求比中值快。如果服务的中值延迟时间等于客户端超时值,则表示一半的请求超时,因此可用性为50%,进而将延迟增加问题转化为可用性问题。

2. 过载的典型表现?

2.1 典型过载环介绍

● 客户端发起一个会造成系统瘫痪的恶意/规模性请求。

● LB节点将这个请求转发给一个后端服务管理节点处理。

● 后端服务管理节点尝试处理这个恶意/规模性请求。

● LB节点自动识别到这个请求后端管理节点无法正常处理,并将处理这个请求的管理节点剔除。

● 客户端再次尝试,且LB将这个恶意请求再次下发给另外一个后端管理节点。

● LB再次将处理这个恶意请求的后端管理节点剔除。

● 恶意/规模请求一直持续下去,直到所有的后端管理节点故障,乃至重大隐患/事件发生。

云服务过载控制的前世今生

2.2 过载表现说明

● 缺少基于优先级的过载控制(按照租户/请求类型QoS),导致请求处理通道堵塞或异常,任何请求均失败。

● 缺少过载感知与溯源能力,海量蚂蚁流类请求无序抢占,导致正常请求出现了性能损失,但无法在短时间内感知过载现象,无法获取过载源。

● 缺少依赖组件过载感知与控制,服务自身请求没有过载,但依赖组件出现过载,导致服务整个链路的请求发生过载。

3. 如何应对服务/应用过载?

应对业务随机突增,扩展服务或应用处理能力,但无法控制客户的请求按照优先级处理。当客户端请求速率超过规格时,相应请求可被拒绝、或可被限制(包括速限制单个客户端对该服务继续施加负载),实现服务或应用已承接业务的持续高可用(已经接入用户,在过载期间SLA满足业务目标)。

过载处理模型:通用可伸缩定律(Universal Scalability Law),阿姆达尔定律Amdahl’s Law的一个衍生理论,定义了系统中的串行化,例如数据库的性能瓶颈,包括关系数据库和非关系数据库,很难做到在线实时扩缩容。重负载时,请求排队等待处理,这时线程争用,上下文切换和垃圾回收等会加重系统负载。请求排队的时间越来越长直到超时,如此形成一个恶性循环。

云服务过载控制的前世今生

服务过载控制是一个循序渐进的过程,在大象流/蚂蚁流的冲击下,服务一般具备三步走的过载控制:

Step1:服务过载自治,包括Scale-out,Scale-up,基于系统自身的基础能力进行扩容。

Step2:感知过载现象,哪个服务/集群出现了过载异常,影响了哪些业务。

Step3: 启动过载控制

3.1基础过载控制:重试保护,小服务主动消费,超时保护,幂等保等基础能力。

3.2中阶过载控制:过载溯源,基于QoS、黑白名单的过载控制。

3.3高阶过载控制:基于AIOPS自动学习,主动进行过载反压,过载拉黑,及精细化QoS、黑白名单控制等。

本文重点介绍服务或应用应对过载的基础能力:

● 重试保护:重试服务调用链中,存在逐级放大的风险。可以每个主调用最多重试1次;为每个依赖项保留少数重试次数(最多10次),如每1000次请求重试次数最多10次。
● 消费者向生产者发起请求:拥有小规格的服务向大规格服务请求,而不是大规格服务请求小规格服务,减少内部冲击!

云服务过载控制的前世今生

● 超时保护:服务依赖项响应慢要有超时保护(如TP99.9出现异常,主动超时),减少服务请求因尝试/多次超时对系统造成持续消耗,最终导致服务过载。
● 幂等设计&过时请求释放:每个请求包含唯一ID,如果与请求ID关联的请求已经成功,在再次获得相同请求时,直接忽略,并确认成功即可(公网不稳定/不可靠是一个长期存在的现实)。且排队过期请求(long live),如50%客户在10秒后放弃请求,系统在5min后处理该请求的意义就不存在了。
● 服务降级:服务在降级/亚健康前,主动拒绝不能处理的请求,减少过度请求对系统造成过载冲击。
● 统一错误码:过载类的API请求或过载类的页面请求定义唯一的标识符,支撑客户端快速感知过载现象,进而在客户端主动规避过载异常。

结束语:

服务过载在云时代是必然存在的,上层应用(比如某购物App,或者某翻译App)客户端少量重负载的大象流或海量的蚂蚁流请求下会造成服务过载,服务端偶发的高负载会造成服务过载,网络的抖动或时延会造成服务过载,互联网各种攻击/恶意行为也会造成服务过载。如何解决与应对成为了云服务开发、运营与运维的关键能力。

如何高效&及时感知过载、有效的处置过载就成为了关键能力,本期我们谈到基础过载控制能力,下期会围绕过载控制与感知的中高阶能力进行介绍,包括过载溯源,精细化与分布式的过载控制等。

 

点击关注,第一时间了解华为云新鲜技术~

原文链接:https://www.cnblogs.com/huaweiyun/p/17268148.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:云服务过载控制的前世今生 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • .net core下对于附件上传下载的实现示例

    实现附件上传下载的功能一般需要考虑三个部分:前端界面展示、后端文件处理和数据存储,下面我来分享一下在 .NET Core 下实现附件上传下载的完整攻略: 前端界面展示 在前端界面,我们可以使用 <input type=”file”> 标签实现文件上传功能,同时通过表单提交的方式将文件传递给后端。这里可以借助一些前端框架来实现,例如 Bootstr…

    云计算 2023年5月17日
    00
  • 微信小程序 封装http请求实例详解

    微信小程序 封装http请求实例详解 简介 在微信小程序开发中,经常需要通过 HTTP 请求后端 API 来获取数据。为减少代码冗余并使功能模块化,我们可以将 HTTP 请求封装在可复用的模块中。减少重复代码的同时,也方便代码的维护和升级。 axios 库 针对HTTP请求处理,可以使用 axios 库,这是一个基于 Promise 的 HTTP 库,可运行…

    云计算 2023年5月17日
    00
  • Python量化交易详细简介

    Python量化交易详细简介 Python作为一种全能编程语言,已经被广泛用于各个领域,量化交易也不例外。Python量化交易是指使用Python编程语言进行交易策略开发和量化分析。本文将详细介绍Python量化交易的方法和步骤。 量化交易 量化交易是指运用计算机科学、数学和统计学等知识对交易策略进行分析、建模和演化,通过程序自动化执行交易。使用量化交易可以…

    云计算 2023年5月18日
    00
  • Asp.net图片上传实现预览效果的简单代码

    下面是关于“Asp.net图片上传实现预览效果的简单代码”的完整攻略,包含两个示例说明。 简介 在ASP.NET应用程序中,图片上传是一个常见的需求。为了提高用户体验,我们通常需要在上传图片时实现预览效果。在本攻略中,我们将介绍如何使用ASP.NET实现图片上传并实现预览效果。 实现步骤 以下是实现ASP.NET图片上传并实现预览效果的步骤: 创建一个HTM…

    云计算 2023年5月16日
    00
  • Python集中化管理平台Ansible介绍与YAML简介

    Python集中化管理平台Ansible介绍与YAML简介 Ansible介绍 Ansible是一种基于Python开发的集中化管理平台,可以使用SSH协议进行连接管理,并支持模块化、可组合的操作方式。其具有轻量、快速、高效、简单易学特点,适用于自动化配置、应用部署、编排等场景。 具体而言,Ansible可以用于: 自动化系统配置:支持定义剧本(playbo…

    云计算 2023年5月18日
    00
  • python中argparse模块基础及使用步骤

    Python中argparse模块基础及使用步骤 argparse是Python的一个重要模块,它提供了一种方便的方式来处理命令行参数。在本文中,我们将学习如何使用argparse模块,包括基础和使用步骤。 基础 argparse模块主要有两个类来处理命令行参数:ArgumentParser和Argument。ArgumentParser被用来创建命令行解析…

    云计算 2023年5月19日
    00
  • .Net6开发winform程序使用依赖注入

    下面是关于“.Net6开发winform程序使用依赖注入”的完整攻略,包含两个示例说明。 简介 依赖注入(Dependency Injection,DI)是一种设计模式,它可以帮助我们更好地管理应用程序中的对象依赖关系。在.NET 6中,我们可以使用依赖注入来管理WinForms应用程序中的对象依赖关系。本文将详细讲解如何在.NET 6中开发WinForms…

    云计算 2023年5月16日
    00
  • 云计算和虚拟机基础梳理

    云计算介绍 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池,(资源包括网络、服务器、存储、应用软件、服务),这些资源能够被快速提供,需要投入很少的管理工作,或与服务供应商进行很少的交互。 1)云计算之前的使用模式 IDC 托管 IDC 租用 虚拟主机(买空间) VPS:虚拟专用主机 2)传统数据中心面临…

    云计算 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部