准备Plan B 如何设计兜底方案

news2024/11/23 21:03:06

对于很多秒杀系统而言,在诸如双十一这样的大流量的迅猛冲击下,都曾经或多或少发生过宕机的情况。当一个系统面临的大流量时,它其实很难单靠自身调整来恢复状态,你必须等待流量自然下降或者认人为地把流量切走才行,这无疑会严重影响用户的购物体验

同时,你也要知道,没有人能够提前预估所有情况,意外无法避免。那么,我们是不是就没办法了呢?当然不是,我们可以在系统达到不可用状态之前做好流量限制,防止最坏情况的发生,用现在流行的话来说,任何一个系统,都需要反脆弱

具体到秒杀这一场景下,为了保证系统的高可用,我们必须设计一个 Plan B方案来兜底,这样在最坏情况发生时我们仍然能够从容应对,今天我们来看下兜底方案设计的一些具体思路

高可用建设应该从哪里着手

说到系统的高可用建设,它其实是一个系统工程,需要考虑到系统建设的各个阶段,也就是说它其实贯穿系统建设的整个生命周期,如下图所以

在这里插入图片描述

具体来说,系统的高可用建设涉及架构阶段、编码阶段、测试阶段、发布阶段、运行阶段,以及故障发生时。接下来,我们分别看一下

  1. 架构阶段:架构阶段主要考虑系统的可扩展性和容错性,要避免系统出现单点问题。例如多机房单元化部署,即使某个城市的机房出现整体故障,仍然不会影响整体网站的运转
  2. 编码阶段:编码最重要的是保证代码的健壮性,例如涉及远程调用问题时,要设置合理的超时退出机制,防止被其他系统拖垮,也要对调用的返回结果集有预期,防止返回的结果超出程序处理范围,最常见的做法就是对错误异常进行捕获,对无法预料的错误要有默认处理结果
  3. 测试阶段:测试主要是保证测试用例的覆盖度,保证最坏情况发生时,我们也有相应的处理流程
  4. 发布阶段:发布时也有一些地方需要注意,因为发布时最容易出现错误,因此要有紧急回滚机制。
  5. 运行阶段:运行时是系统的常态,系统大部分时间都会处于运行态,运行态最重要的是对系统的监控要准确及时,发现问题能够准确报警并且报警数据要准确详细,以便于排查问题
  6. 故障发生:故障发生时首先最重要的就是及时止损,例如由于程序问题导致商品价格错误,那就是要及时下架商品或者关闭购买链接,防止造成重大资产损失,然后就是要能够及时恢复服务,并定位原因解决问题

为什么系统的高可用建设要放到整个生命周期中全面考虑?因为我们每个环节中都可能犯错误,而有些环节犯的错,你再后面是无法弥补的。例如在架构阶段,你没有消除单点问题,那么系统上线后,遇到突发流量把单点给挂了,你就只能干瞪眼,有时候想加机器都加不进去,所以高可用建设是一个系统工程,必须在每个环节都做好。

那么针对于秒杀系统,我们重点介绍在遇到大流量时,应该从哪方面来保障系统的稳定运行,所以更多的是如何针对运行阶段进行处理,这就引出接下来的内容:降级、限流和拒绝服务

降级

所谓“降级”,就是当系统的容量达到一定程度时,限制或者关闭系统的某些非核心功能,从而把有限的资源保留给更核心的业务,它是一个有目的、有计划的执行过程,所以对降级我们一般需要有一套预案来配合执行。如果我们把它系统化,就可以通过预案系统和开关系统来实现降级

降级方案可以这样设计:当秒杀流量达到5w/s 时,把成交记录的获取从展示 20 条降级到只展示5条。从20改到5这个操作由一个开关来实现,也就是设置一个能够从开关系统动态获取的系统参数

这里,我给出开关系统的示意图,它分为两部分,一部分是开关控制台,它保存了开关的具体配置信息,以及具体执行开关所对应的机器列表;另一部分是执行下发开关数据的 Agent ,主要任务就是保证开关被正确执行,即使系统重启后也会生效
在这里插入图片描述

执行降级无疑是在系统性能和用户体验之间选择了前者,降级后肯定会影响一部分用户的体验,例如在双 11 零点时,如果优惠券系统扛不住,可能会临时降级商品详情的优惠信息展示,把有限的系统资源用在保障交易系统正确展示优惠信息上,即保障用户真正下单时的价格是正确的,所以降级的核心目的是牺牲次要的功能和用户体验保证核心业务流程的稳定,是一个不得已而为之的举措。

限流

如果降级是牺牲了一部分次要的功能和用户的体验效果,那么限流就是更极端的一种保护措施了,限流就是当系统容量达到瓶颈时,我们需要通过限制一部分流量来保护系统,并做到即可以人工执行开关,也支持自动化保护的措施。

这里,我同样的给出了限流系统的示意图,总体来说,限流既可以是在客户端限流,也可以实在服务端限流。此外,限流的实现方式既要支持URL 以及方法级别的限流,也要支持基于QPS 和线程的限流

首先,我以内部的系统调用为例,来分别说下客户端限流和服务端限流的优缺点

  • 客户端限流,好处可以限制请求的发出,通过减少发出无用请求从而减少对系统的消耗。缺点就是当客户端比较分散时,没法设置合理的限流阈值:如果阈值设的太小,会导致服务端没有达到瓶颈时客户端已经被限制;而如果设太大,则起不到限制的作用。
  • 服务端限流,好处是可以根据服务端的性能设置合理的阈值,而缺点就是被限制的请求都是无效的请求,处理这些无效的请求本身也会消耗服务器资源

在这里插入图片描述

在限流的实现手段上来讲,基于QPS和线程数的限流应用最多,最大QPS很容易通过压测提前获取,例如我们的系统最高支持1W QPS时,可以设置8000 来进行限流保护,线程数限流在客户端比较有效,例如在远程调用时我们设置的连接池的线程数,超出这个并发线程请求,就将线程进行排队或者直接超时丢弃

限流无疑是会影响用户的正确请求,所以必须到导致一部分用户请求失败,因此在系统处理这种异常时一定要设置超时时间,防止因被限流的请求不能 fast fail (快速失败)而拖垮系统

拒绝服务

如果限流还不能解决问题,最后一招就是直接拒绝服务了

当系统负载达到一定阈值时,例如CPU使用率达到90%或者系统load值达到2*CPU核数时,系统直接拒绝所有请求,这种方式是最暴力但也最有效的系统保护方式。例如秒杀系统,我们在如下几个环节设计过载保护:
在最前端的Nginx 上设置过载保护,当机器负载达到某个值时直接拒绝HTTP请求并返回503错误码,在java层同样也可以设计过载保护
拒绝服务可以说是一种不得已的都方案,用以防止最坏情况发生,防止因把服务器压垮而长时间彻底无法提供服务。像这种系统过载保护虽然在过载时无法提供服务,但是系统仍然可以运作,当负载下降时又很容易恢复,所以每个系统和每个环节都应该设置这个兜底方案,对系统做最坏情况下的保护

总结一下

网站的高可用建设是基础,可以说要深入到各个环节,更要长期规划并进行体系化建设,要在预付(简历常态的压力体系,例如上线前的单机压测到上线后的全链路压测)、管控(做好线上运行时的降级、限流和兜底保护)、监控(建立性能基线来记录性能的变化趋势以及线上机器的负载报警体系,发现问题及时预警)和恢复体系(遇到故障要及时止损,并提供快速的数据订正工具等)等这些地方加强建设,每一个环节可能都有很多事情要做。

另外,要保证高可用建设的落实,你不仅要做系统建设,还要在组织上做好保障。高可用其实就是在说“稳定性”。稳定性是一个平时不重要,但真出了问题就会要命的事儿,所以很可能平时业务发展良好,稳定性建设就会给业务让路,相关的稳定性负责人员平时根本得不到重视,一旦遇到故障却又成了“背锅侠”。

而要防止出现这种情况,就必须要在组织上有所保障,例如可以让业务负责人背上稳定KPI考核指标,然后在技术部门中简历稳定性建设小组,小组成员由每个业务线的核心力量兼任,他们的KPI由稳定性负责人来打分,这样稳定性小组就可以把一些建设任务落实到具体的业务系统中了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

高通Ride软件开发包使用指南(7)

高通Ride软件开发包使用指南(7)6.5 构建 x86 Ubuntu SDK6.6端到端可视化6.7 x86 Ubuntu上的功能验证6.7.1简单比特率验证6.7.2在x86笔记本上用 8xCams HEVC格式 录制 FPS6.8记录仪6.5 构建 x86 Ubuntu SDK 构建 x86 ubuntu ~/src/qride/stack-sdk$ ./ex…

十个精妙绝伦的SQL语句,说尽SQL精华

目录引子十大SQL1. 统计班级总分前十名2. 删除重复记录, 且保留一条3. 最大连续登陆天数的问题4. 计算除去部门最高工资,和最低工资的平均工资5. 计算占比和同比增长6. 算成绩7.算昨天每个城市top 10消费金额的用户,输出city_id,city_name,uid, 消费总金…

C语言刷题(3)

🐒博客名:平凡的小苏 📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情 目录 计算体重指数 计算三角形周长和面积 KiKi和酸奶 网购 变种水仙花 计算体重指数 描述 问题:计算BMI指数&#xff0…

安全可信 | 强墙出击!天翼云Web应用防火墙(原生版)硬核亮相!

12月9日,由中国信息通信研究院主办的“墙墙联合——云上防火墙技术沙龙”在线上顺利举行,天翼云科技有限公司研发专家吴雷分享了新标准、新需求下云Web应用防火墙(云WAF)的发展方向,并介绍了天翼云Web应用防火墙&#…

如何从 OVF 或 OVA 文件中部署虚拟机

从 OVF 或 OVA 文件中部署虚拟机 使用新建虚拟机向导从 OV F和 VMDK 文件或 OVA 文件部署虚拟机。由于 Web 浏览器的限制,OVA 部署仅限于1GB以下的文件。要部署大于1GB的 OVA 文件,请使用 tar 提取 OVA 文件并分别提供OVF和VMDK文件。 一、右键单击导航器中的‘‘虚拟机“,…

Android:远程调试WebView

目录 前言 配置WebView 手机设置 远程调试 前言 APP中使用WebView展示网页的结果可能不太理想,那么我们想调试的话就没有在浏览器当中调试方便,不过谷歌浏览器给我们提供了能远程调试的方案。 官方文档:https://developer.chrome.com…

Blazor也可以用MarkDown!Vditor-Blazor基础使用教程以及部分源码解析!Ant-Designer-Blazor

前言 Ant-Designer-Blazor组件库是一款非常好用的Blazor的UI框架库,使用很少的精力就可以搭建出一个漂亮的UI界面了。 但是Ant-Designer-Blazor中尚缺少对MarkDown组件的支持,所以只能下载Nuget包里面的一个Vditor(也是Ant-Designer的&#…

设计师常用网站,建议收藏

这几个设计师常用网站,你不知道就落后了 设计党赶紧收藏!1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 免费设计素材。 站内平面海报、UI设计、电商淘宝、免抠、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能,能有…

坦克大战③

1.防止敌人坦克重叠运动 八种情况 这辆敌方坦克和任何其它敌方坦克都不发生碰撞时且不超边界时才可以移动 2.记录玩家成绩 绘制版面信息 paint()方法中如果没有super.paint(g),那么绘制的敌方坦克数会出现重叠情况 调用方法 在Recorder类中定义一个方法…

Java 性能诊断工具简介-EJ Technologies JProfiler 12.0.5 中文激活版

目录 JProfiler 这篇文章讲解的比较详细: 可以辅助命令,应用jar的启动命令: 同时在开发工具里面添加一个JProfiler插件 JProfiler 这篇文章讲解的比较详细: JVM性能分析工具 Jprofiler - 百里浅暮 - 博客园 我在这里记录下。…

MATLB|电动汽车充放电的最优调度

目录 一、概述 二、电动汽车 2.1 电动汽车的类型 2.2电动汽车行程开始时间 2.3 电动汽车行驶里程 三、Matlab实现 3.1 代码前的准备 3.2 运行结果 四、往期回顾 五、Matlab代码实现 一、概述 电动汽车能够良好发展离不开精确的电动汽车充电负荷预测,目前,大多数充电负…

2022全年度烘干机十大热门品牌销量榜单

在“宅经济”时代,人们对大家电的需求持续高速增长。在当前的大环境下,人们的健康意识在不断提高,拥有除菌防菌功能的烘干机也更受欢迎。因此,烘干机作为快速进入普及阶段的家电新品,市场增长空间非常大。 根据鲸参谋数…

RCE绕过靶场练习

目录 CTF-01 CTF-02 CTF-03 CTF-04 CTF-05 CTF-01 测试回显 Array ([0] > PING 127.0.0.1 (127.0.0.1): 56 data bytes[1] > 64 bytes from 127.0.0.1: seq0 ttl42 time0.028 ms[2] > 64 bytes from 127.0.0.1: seq1 ttl42 time0.059 ms[3] > 64 bytes from …

Javascript 面向对象的缺陷,父类能调用被子类重写后的方法

问题背景 前些天做项目练手时,遇到一个需要写类的场景,各个类之间的交互我打算用事件的方式进行,就自然地在父类继承了EventEmitter类。然后在父类对一个具体事件注册了一个默认监听,子类通过注册自己专有的监听细化逻辑。代码逻…

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决

win7关闭驱动签名,进入驱动测试模式win7、win10关闭驱动签名、进入驱动测试模式DebugView工具运行提示"Dbgv.sys: 拒绝访问"驱动项目配置属性常用设置驱动中KdPrint打印UNICODE_STRING字符串常用方法没使用的变量在编译时报警告:未引用的形参错…

文字转语音真人发声软件哪个好?这些实用软件快来收好

平时大家结束了一天的工作,会不会在空闲时间好好放松一下呢?如果是坐公交车或者地铁的小伙伴,想要在下班途中看一些电子书籍或者新闻,却因为下班高峰期人潮拥挤,导致无法腾出手来阅读,这时候你们会怎么解决…

红队基础知识

文章目录红队前置准备网络攻击链工程和操作攻击性思维渗透测试漏洞研究软件开发基础设施网络和系统逆向工程社会工程学物理安全威胁情报安全事件的检测和响应技术写作培训与汇报总结红队前置准备 红队通常指在对抗情况下需要仿真、模拟或以其他方式扮演某个、某组入侵者或理论…

【Docker】(一)基本概念与安装使用

1.概述 最近学习了Docker的使用,想通过一个系列的笔记来记录学习的过程与收获,并为以后的生产工作提供指导。 我一直认为学习一门技术时,需要先了解这门技术的基本概念,了解它能解决的问题,这样才能定位明确的学习目标…

frp内网穿透https

在公网服务器搭建frps(service),在内网本地机子搭建frpc(client),流量通过访问公网ip,经过frps服务端转发到fprc客户端,fprc再转发到本地web应用。 官方下载地址​ https://github.com/fatedier/frp/releases 官方文档地址https…