核心订单链路兜底方案之限流熔断降级实战

需求场景

对于很多电商系统而言,在诸如双十一这样的大流量的迅猛冲击下,都曾经或多或少发生过宕机的情况。当一个系统面临持续的大流量时,它其实很难单靠自身调整来恢复状态,你必须等待流量自然下降或者人为地把流量切走才行,这无疑会严重影响用户的购物体验。
我们可以在系统达到不可用状态之前就做好流量限制,防止最坏情况的发生。针对电商系统,在遇到大流量时,更多考虑的是运行阶段如何保障系统的稳定运行,常用的手段:限流、降级、拒绝服务。

限流实战

限流相对降级是一种更极端的保存措施,限流就是当系统容量达到瓶颈时,我们需要通过限制一部分流量来保护系统,并做到既可以人工执行开关,也支持自动化保护的措施。
限流既可以是在客户端限流,也可以是在服务端限流。限流的实现方式既要支持 URL 以及方法级别的限流,也要支持基于 QPS 和线程的限流。

(1)客户端限流
好处:可以限制请求的发出,通过减少发出无用请求从而减少对系统的消耗。
缺点:当客户端比较分散时,没法设置合理的限流阈值。如果阈值设的太小,会导致服务端没有达到瓶颈时客户端已经被限制;而如果设的太大,则起不到限制的作用。

(2)服务端限流
好处:可以根据服务端的性能设置合理的阈值。
缺点:被限制的请求都是无效的请求,处理这些无效的请求本身也会消耗服务器资源。

在限流的实现手段上来讲,基于 QPS 和线程数的限流应用最多,最大 QPS 很容易通过压测提前获取,例如我们的系统最高支持 1w QPS 时,可以设置 8000 来进行限流保护。线程数限流在客户端比较有效,例如在远程调用时我们设置连接池的线程数,超出这个并发线程请求,就将线程进行排队或者直接超时丢弃。
限流必然会导致一部分用户请求失败,因此在系统处理这种异常时一定要设置超时时间,防止因被限流的请求不能 fast fail(快速失败)而拖垮系统。

(3)限流的方案

  • 前端限流
  • 接入层 nginx 限流
  • 网关限流
  • 应用层限流

网关限流

业务场景:
商品详情页入口流量防护:黑白名单,限制同一个 ip 访问频率,限制查询商品接口调用频率。

方案一:基于 redis+lua 脚本限流
gateway 官方提供了 RequestRateLimiter 过滤器工厂,基于 redis+lua 脚本方式采用令牌桶算法实现了限流。

方案二:整合 sentinel 限流
利用 Sentinel 的网关流控特性,在网关入口处进行流量防护,或限制 API 的调用频率。

Spring Cloud Gateway 接入 Sentinel 实现限流的原理:

网关接入 sentinel 实战

1)引入依赖

<!‐‐添加Sentinel的依赖‐‐>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐alibaba‐sentinel</artifactId>
</dependency>

<!‐‐ gateway接入sentinel ‐‐>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring‐cloud‐alibaba‐sentinel‐gateway</artifactId>
</dependency>

2)接入 sentinel 制台,修改 application.yml 配置

spring:
  application:
  name: gateway
  main:
  allow‐bean‐definition‐overriding: true
  cloud:
  sentinel:
  transport:
  dashboard: 192.168.65.103:8000

3)启动 sentinel 控制台

下载地址: https://github.com/alibaba/Sentinel/releases/download/1.8.4/sentineldashboard-1.8.4.jar

java ‐Dserver.port=8000 ‐jar sentinel‐dashboard‐1.8.4.jar

访问[http://192.168.65.103:8000/#/login](http://192.168.65.103:8000/#/login) ,默认用户名密码: sentinel/sentinel

4)测试
启动网关服务,商品服务,访问商品详情接口[http://localhost:8888/pms/productInfo/27](http://localhost:8888/pms/productInfo/27)
从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:
route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId;
自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组;

route 维度限流
需求:对商品详情接口进行流控

1)配置流控规则
image.png

2)jemeter 压测配置
压测接口:[http://localhost:8888/pms/productInfo/27](http://localhost:8888/pms/productInfo/27)
image.png

3)查看jemeter压测结果
image.png

4)查看 sentinel 控制台实时监控效果
image.png

应用层限流

微服务接入 sentinel。

场景:对秒杀下单接口进行流控。
Sentinel 匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。该方式的作用如下图所示:
image.png
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
注意:匀速排队模式暂时不支持 QPS > 1000 的场景。

场景:商品详情接口热点参数限流。
很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制;
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制;
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

注意:

  1. 热点规则需要使用@SentinelResource("resourceName")注解,否则不生效;
  2. 参数必须是 7 种基本数据类型才会生效;

降级实战

降级就是当系统的容量达到一定程度时,限制或者关闭系统的某些非核心功能,从而把有限的资源保留给更核心的业务。
比如降级方案可以这样设计:当秒杀流量达到 5w/s 时,把成交记录的获取从展示 20 条降级到只展示 5 条。“从 20 改到 5”这个操作由一个开关来实现,也就是设置一个能够从开关系统动态获取的系统参数。
降级的核心目标是牺牲次要的功能和用户体验来保证核心业务流程的稳定,是一个不得已而为之的举措。例如在双 11 零点时,如果优惠券系统扛不住,可能会临时降级商品详情的优惠信息展示,把有限的系统资源用在保障交易系统正确展示优惠信息上,即保障用户真正下单时的价格是正确的。

服务降级的策略

应用层降级实战

场景:用户下单接口

拒绝服务

拒绝服务可以说是一种不得已的兜底方案,用以防止最坏情况发生,防止因把服务器压跨而长时间彻底无法提供服务。当系统负载达到一定阈值时,例如 CPU 使用率达到 90% 或者系统 load 值达到 2*CPU 核数时,系统直接拒绝所有请求,这种方式是最暴力但也最有效的系统保护方式。
例如秒杀系统,我们可以在以下环节设计过载保护:
在最前端的 Nginx 上设置过载保护,当机器负载达到某个值时直接拒绝 HTTP 请求并返回 503 错误码。
阿里针对 nginx 开发的过载保护扩展插件 sysguard:

https://github.com/alibaba/nginx-http-sysguard

在 Java 层同样也可以设计过载保护。 比如 Sentinel 提供了系统规则限流。

Sentinel 系统规则限流

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

  • Load 自适应(仅对 Linux/Unix­like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0­1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件操作命令@touch、cat、more、cp、mv、rm

目录 命令touch语法形式作用 命令cat语法形式作用 命令more语法形式作用 命令cp语法形式作用复制文件复制文件夹 命令mv语法形式作用移动文件移动文件夹情况三 命令rm语法形式作用删除文件删除文件夹-f 选项通配符 * 总结 命令touch 语法形式 touch Linux路径 》touch命令无…

使用Guava轻松创建和管理不可变集合

第1章&#xff1a;引言 大家好&#xff0c;我是小黑。今天&#xff0c;我们来聊聊一个在Java编程里超有用的话题&#xff1a;使用Guava创建和管理不可变集合。首先&#xff0c;咱们得明白&#xff0c;什么是不可变集合。简单来说&#xff0c;不可变集合就是一旦创建就不能被修…

STL体系结构概述

文章目录 STL是什么&#xff1f;STL的六大组件STL的实现版本额外补充一、容器范围区间二、容器结构与分类序列式容器关联容器有序关联容器不定序关联容器 参考 本文将是STL系列的第一篇文章&#xff0c;主要参考《STL源码剖析》&#xff0c;辅以网络博文&#xff0c;不定时更新…

DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码

翻出来之前写的代码&#xff0c; EasyxDevC开发地图编辑和游戏编辑代码工程文件附注释_哔哩哔哩_bilibili 每次把代码备份下来&#xff0c;等着有一天能够复用代码&#xff0c;产生新的价值。 结果最近这几天才来回顾记录emm “这是怎么搓出来的&#xff1f;”从10行代码到…

代码审查工具FishEye详细使用教程

1. Git代码仓库设置 1、登录并进入到FishEye主页面&#xff0c;点击Repositories进入仓库管理页面&#xff0c;如下图&#xff1a; 2、填写仓库信息&#xff0c;如下图&#xff1a; 3、填写Git地址 http://gitAccount:gitPwd118.24.231.166:8080/git/git/iot-lvdao/iot-dhcc.…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课&#xff1a; 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础&#xff08;一&#xff09;——任务设计、任务管理&#xff08;创建&基本状态&内部任务&#xff09;、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路&#xff0c; 一种是通过wind.open()方法传第二个参数&#xff0c; A页面&#xff1a; //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值&#xff0c;代表跳转页面都为music标签页&#xff0…

计算机服务器中了halo勒索病毒如何解密,halo勒索病毒解密数据恢复

计算机技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但也为网络安全埋下隐患&#xff0c;网络上的勒索病毒种类也在不断增加&#xff0c;给企业的数据安全带来了严重威胁。近日&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0c;企业的计算…

Unity3D移动端实现摇一摇功能

手机摇一摇功能在平时项目开发中是很常见的需求&#xff0c;利用Unity的重力感应可以很方便的实现该功能。 Unity简化了重力感应的开发&#xff0c; 通过访问Input.acceleration属性&#xff0c;取回加速度传感器的值。首先我们看一下重力传感器的方向问题。Unity3D中重量的取…

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存&#xff08;通常是动态分配的堆内存&#xff09;&#xff0c;但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源&#xff0c;持续的内存泄漏还导致系统内存的逐渐耗尽&#xff0c;最…

【Linux】进程周边007之进程控制

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.进程创建 2.进程终止 2.…

python调用DALL·E绘画

实现用gpt的api和他对话后&#xff0c;我们试着调用DALLE的api进行绘画 参考文档 OpenAI API 运行代码 from openai import OpenAIclient OpenAI()user_prompt input("请输入您想生成的图片描述: ")response client.images.generate(model"dall-e-3"…

SpringIOC之SimpleTimeZoneAwareLocaleContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

CSS新手入门笔记整理:CSS3弹性盒模型

特点 子元素宽度之和小于父元素宽度&#xff0c;所有子元素最终的宽度就是原来定义的宽度。子元素宽度之和大于父元素宽度&#xff0c;子元素会按比例来划分宽度。在使用弹性盒子模型之前&#xff0c;必须为父元素定义“display:flex;”或“display:inline-flex;”。 弹性盒子…

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…

一文搞懂 java8 reduce操作

什么是 reduce Java8 中有两大最为重要的改变&#xff0c;其一是 Lambda 表达式&#xff0c;另一个就是 Stream API 了。 Stream 是 Java8 中处理集合的关键抽象概念&#xff0c;它将数据源流化后&#xff0c;可以执行非常复杂的查找、过滤和映射数据、排序、切片、聚合统计等…

中国化妆品头部企业环亚集团携美肤宝、法兰琳卡、滋源、肌肤未来等“新朋友”加入实在智能数智生态圈

广州环亚化妆品科技股份有限公司&#xff08;以下简称“环亚集团”&#xff09;是一家综合性美容化妆品高新技术企业&#xff0c;旗下拥有美肤宝、法兰琳卡、滋源、肌肤未来等多个品牌&#xff0c;产品涵盖洁肤护肤、洗护发、身体护理、精油等多个领域。在中国、澳大利亚、美国…

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…

【C++刷题】前缀和

【C刷题】前缀和 一、前缀和1、题目链接2、解析3、代码 二、二位前缀和1、题目链接2、解析3、代码 三、寻找数组的中心下标1、题目链接2、解析3、代码 四、除自身以外数组的乘积1、题目链接2、解析3、代码 五、和为K的子数组1、题目链接2、解析3、代码 六、和可被K整除的子数组…