首页 > 其他分享 >八、Sentinel之流量控制

八、Sentinel之流量控制

时间:2023-07-02 17:55:26浏览次数:38  
标签:控制 请求 流控 流量 限流 线程 Sentinel QPS 阈值

FlowSlot 会根据预设的规则,结合前面 NodeSelectorSlot、ClusterNodeBuilderSlot、StatistcSlot 统计出来的实时信息进行流量控制。

限流的直接表现是在执行 Entry nodeA = SphU.entry(资源名字) 的时候抛出 FlowException 异常。FlowException 是 BlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑。

同一个资源可以对应多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource:资源名,即限流规则的作用对象

  • count: 限流阈值

  • grade: 限流阈值类型,QPS 或线程数

  • strategy: 根据调用关系选择策略

 
流量控制主要有两种统计类型,一种是统计线程数,另外一种则是统计 QPS。

一、 流控类型

QPS流量控制

QPS是每秒请求数,QPS流量控制是请求数流量控制,当每秒的请求数超过设置的阈值时触发流量控制。

并发线程数流量控制

线程数限流用于保护业务线程数不被耗尽。例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对高线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离),或者使用信号量来控制同时请求的个数(信号量隔离)。这种隔离方案虽然能够控制线程数量,但无法控制请求排队时间。当请求过多时排队也是无益的,直接拒绝能够迅速降低系统压力。Sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数,如果超出阈值,新的请求会被立即拒绝。

 

案例参考:https://github.com/alibaba/Sentinel/blob/master/sentinel-demo/sentinel-demo-basic/src/main/java/com/alibaba/csp/sentinel/demo/flow/FlowThreadDemo.java

二、流控模式

点开流控规则的高级选项,可以看到有三种流控模式:

流控模式 说明
直接 对当前请求的资源达到阈值触发限流,默认
关联 与当前请求的资源关联的另一个资源达到阈值时,触发当前资源的限流
链路 从指定链路访问本资源,达到阈值时触发限流

 

在Sentinel的左侧选择服务实例后,选择流控规则,点击右上角的新增流控规则,点击高级选项:
 

 

资源名如下:

@RequestMapping("/index")
@SentinelResource("HelloConsumer-index")
public String index() {
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return "index";
}

 

直接模式

 

 

设置HelloConsumer-index资源的QPS为20,用jmeter测试:
 

 

 

看到异常为25%。当资源HelloConsumer-index的QPS超过20时触发限流。

关联模式

资源名:

@RequestMapping("/write")
@SentinelResource("HelloConsumer-write")
public String write() {
    return "success";
}


@RequestMapping("/read")
@SentinelResource("HelloConsumer-read")
public String read() {
    return "success";
}

HelloConsumer-read关联HelloConsumer-write:

 

 

用jmeter测试:
 

 

 

运行jmeter后,用浏览器访问http://localhost:7001/consumer/read,发现被限流。关闭jemter后在访问http://localhost:7001/consumer/read,发现可以访问。

链路模式

要使用链路模式,首先关闭Context收敛,这样被监控方法可以进行不同链路的单独控制,在application.properties配置:

spring.cloud.sentinel.web-context-unify=false

 

添加公共资源:

@Service
public class HelloService {

    @SentinelResource("HelloService")
    public String hello() {
        return "hello service";
    }
}

添加两个链路入口:

@RequestMapping("/consumer/hello1")
public String  hello1() {
    return helloService.hello();
}

@RequestMapping("/consumer/hello2")
public String  hello2() {
    return helloService.hello();
}

 

在Sentinel中配置限流规则:
 

 

只有从/consumer/hello1进入访问资源HelloService才限流。

接下来配置jmeter:

 

 

 

让jmeter持续执行。用浏览器访问http://localhost:7001/consumer/hello1,看到发生了限流。访问http://localhost:7001/consumer/hello2,发现没有限流。停止jmeter后访问http://localhost:7001/consumer/hello1,发现没有限流。

三、流控效果

只有选择阈值类型为QPS时才有流控效果:
 

 

 

流控效果 说明
快速失败 该方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。
Warm Up(预热) 该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。
排队等待 让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长,对应的是漏桶算法。

 

Warm Up

在Sentinel配置流控效果:

 

 

这里配置预热时长是5,在5秒后系统接收请求数逐步达到最大阈值。

 

在jmeter中配置:
 

 
配置的最大QPS是20。

执行后,查看结果:
 

 

 

 

可以看到,随着时间的增加,通过的请求数增多,拒绝的请求数减少,最后全部通过。

排队等待

这种方式严格控制了请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

 

在Sentinel中配置排队等待流控效果:
 

 

超时时间设置为5秒。

 

配置jmeter:
 

 
配置QPS为15。

 

通过实时监控:
 

 

通过的QPS都是10。不管发出的流量是多少,输出的QPS都是10。起了均衡流量的作用。

标签:控制,请求,流控,流量,限流,线程,Sentinel,QPS,阈值
From: https://www.cnblogs.com/shigongp/p/17520025.html

相关文章

  • Kong入门学习实践(8)流量控制插件
    Kong的一大特色就在于强大的可扩展性,具体实现方式就是插件。一来Kong已经提供了很多内置的插件,二来我们也可以使用Lua语言自定义开发插件。今天,我们就来了解一些常用的流量控制插件。关于流量控制插件我们在实际应用往往会有一些场景需要限流和限频,从而管理入站和出站的流量。......
  • CANopen转ProfiNet网关在大跨径门机起重设备同步纠偏控制应用案例
     大型门机起重设备纠偏控制系统采用CanOpen通讯协议,而PLC使用的是ProfiNet协议,看似不兼容的两种协议如何实现互通?今天我们来看一下这个案例。通过捷米特JM-COP-PN设置纠偏系统的参数,同时采集门机左右双轨的轮子多点同步控制,速度、位置等信息。在经过简单的配置后,用户可以很轻......
  • C# 学习笔记 - 控制流
    控制流条件语句、迭代语句、跳转语句和异常处理语句控制程序的执行流。条件语句使用关键字if,switch来决定执行某些语句迭代语句使用关键字do,while,for,foreach和in创建一个循环跳转语句使用关键字break,continue,return和yield转移程序控制条件语句(Condi......
  • N层研习记录01:试图通过Boolean参数控制并发冲突的检查方式(LINQ to SQL)
    作者:光脚丫思考如果你只想快速的查看测试代码的主题部分,或者想更具体的了解测试的详细记录,则可以参看另一篇名为《N层研习中的测试代码01》的博文,地址是:微软MSDN带来的困惑微软的MSDN确实是个好东西,其中提供的技术资料,只要你善于去学习,必定是会受益匪浅的。毕竟,技术是微软的,它所......
  • 使用Redis时的vm.overcommit_memory内存分配控制
    最近在使用Redis的时候遇到了linux系统中的vm.overcommit_memory参数设置,对此不是很了解,于是研究了一下,有了本文。 ===================================== 一个尝试,如何在内存中申请空间:>>>100000*400000*8/1024/1024/1024298.0232238769531 实际代码:importnumpyas......
  • Sentinel源码分析
    Sentinel的基本概念Sentinel实现限流、隔离、降级、熔断等功能,本质要做的就是两件事情:统计数据:统计某个资源的访问数据(QPS、RT等信息)规则判断:判断限流规则、隔离规则、降级规则、熔断规则是否满足这里的资源就是希望被Sentinel保护的业务,例如项目中定义的controller方法就是......
  • VBA控制鼠标键盘
     'sleep函数PrivateDeclareSubSleepLib“kernel32”(ByValdwMillisecondsAsLong)'获取鼠标坐标PrivateTypePOINTAPIXAsLongYAsLongEndTypePrivateDeclareFunctionGetCursorPosLib“User32”(lpPointAsPOINTAPI)AsLong'移动鼠标......
  • 数据流量来回路径一致配置
    修改OSPF开销,实现数据来回路径一致未配置前,路由表有多条路径[R1]displayiprouting-tableRouteFlags:R-relay,D-downloadtofib------------------------------------------------------------------------------RoutingTables:PublicDestinations:37......
  • Ryu控制器教程
    RYU不要使用apt的方法安装,这样的安装是不完整的,并且相关文件不易查找。1.下载ryu源码cdcdDesktopgitclonehttps://gitee.com/lpm-123/ryu2.安装RYU环境安装PIPcdryupipinstall-rpip-requirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple安装依......
  • TCP协议的滑动窗口具体是怎样控制流量的?
    目录前言TCP协议概述滑动窗口的原理1发送方的滑动窗口:2接收方的滑动窗口:控制流量的机制1慢启动2拥塞避免3拥塞控制实例演示总结前言TCP协议是互联网中广泛使用的传输层协议之一,用于可靠地传输数据。其中,滑动窗口是TCP协议中用于控制流量和实现可靠传输的重要机制。本文将介......