隔离规则通过控制接口或依赖的并发线程数,来保证系统的稳定性。通常适用于应用内部或下游依赖出现不稳定的场景,例如慢SQL、下游应用响应时间变长等。本文介绍如何配置和管理隔离规则。

前提条件

将应用接入AHAS应用防护,具体操作请参见接入应用概述

背景信息

当强依赖的方法或接口出现不稳定的时候,可以通过配置并发线程数来限制不稳定的强依赖并发数,起到隔离异常的效果。若运行该请求的响应时间变长,会导致线程的并发数变大。当并发数超过阈值以后,AHAS将拒绝多余的请求,直到堆积的任务完成,并发线程数变少。达到将异常隔离,减小不稳定性的效果。

如何设定并发线程数阈值,可参见以下内容:

  • 并发线程数 = 期望QPS*响应时间+冗余量。
  • 例如预期的SQL执行时间为20毫秒,预期该请求每秒有20个,并发最大时候是6个,建议并发线程数按照以下逻辑设置:Max(20/1000*20,6)= 6 ,再加上冗余量2 ,则建议并发数阈值设置为8。
  • 设置好后,当这个SQL发生死锁或者有性能问题,SQL运行特别慢成为慢SQL时,即使请求不断的进来,也仅仅会占用10个线程,不会因为持续进来的请求(请求也无法在短时间内退出),从而耗光进程的活跃线程。
  • 当这个SQL恢复正常后,并发数会迅速减少。当并发数减少至低于预设的阈值时,系统就不会拒绝请求,应用的处理能力也快速的恢复。通过这样的方式,起到了根据响应时间自动调节的效果,隔离了不稳定的应用。

隔离规则配置通常用于强依赖隔离场景,详情请参见强依赖隔离

功能入口

  1. 登录AHAS控制台
  2. 在AHAS控制台左上角,选择应用接入的地域
  3. 在控制台左侧导航栏中选择流量防护 > 应用防护
  4. 应用列表页面单击目标应用卡片。
  5. 选择以下任意一种方法进入新建隔离规则页面:
    • 在左侧导航栏单击应用概览,然后单击页面下方目标接口操作列中的隔离
    • 在左侧导航栏单击接口详情,在接口详情页面单击资源卡片右上角新增管理规则的图标,然后在管理规则对话框中单击新增隔离规则
    • 在左侧导航栏单击规则设置,单击隔离规则页签,在页面右上角单击新增隔离规则
  6. 新建隔离规则对话框中配置规则信息。参数说明请参见更多信息

常用场景1 保障自身资源充足

当运行该请求的响应时间变长,会导致线程的并发数变大。当并发数超过阈值以后,AHAS将拒绝多余的请求,直到堆积的任务完成,并发线程数变少。达到将异常隔离,减小不稳定性的效果。例如某个SQL执行时间为20毫秒,预期该请求每秒有20个。

新建隔离规则对话框中配置如下规则信息。

  • 填写接口名称来源应用
  • 统计维度选择当前接口
  • 并发数阈值为10。
Quarantine_new

设置完成后,当这个SQL发生死锁或者存在性能问题时,该SQL运行变慢,成为慢SQL,此时即使请求不断进来,也仅仅会占用10个线程,不会因为持续进来的请求(请求也无法在短时间内退出),从而耗光进程的活跃线程。当这个SQL恢复正常后,并发数会迅速减少。当并发数减少至低于预设的阈值时,系统就不会拒绝请求,应用的处理能力也快速的恢复。通过这样的方式,起到了根据响应时间自动调节的效果,隔离了不稳定的应用。

常用场景2 有一定相关联性的接口

当关联接口被来源应用调用QPS超过阈值时,会对当前接口来源应用的请求进行限流,有一定的相关性的方法来配置规则。例如read_dbwrite_db这两个资源分别代表数据库读写,write_db接口优先级更高。

为保证读写资源争抢时,write_db的接口可以留足资源,可在新建隔离规则对话框中配置如下规则信息。

  • 接口名称write_db
  • 统计维度选择关联接口
  • 关联接口名read_db
  • 并发数阈值为10。
Quarantine_new_associated

这样在read_db接口被调用QPS超过10次后,会对write_db接口来自于来源应用的请求进行隔离限流,保证write_db的足够资源。

常用场景3 针对入口链路来配置隔离规则

从入口处将资源进行分别隔离,以保障更高优先级入口。当callstack入口被来源应用调用QPS数超过阈值时,会对当前接口来自于来源应用的请求进行隔离流控。

新建隔离规则对话框中配置如下规则信息。

  • 填写接口名称来源应用
  • 统计维度选择链路入口
  • 并发数阈值设置为10。
Quarantine_new_entrance

callstack入口的接口被调用超过10次,当前接口user_test会对来自于来源应用的请求进行隔离流控。

更多信息

新建隔离规则页面参数解释如下。

参数 描述
接口名称 待隔离的资源名称。
来源应用 该规则针对的来源应用,默认来源应用设为default,表示不区分来源应用。
  • 若是Dubbo服务,请填写对应调用方的Dubbo applicationName,注意调用方也需要接入Sentinel。
  • 若是Web服务,请参见扩展接口
  • 若是通过注解、自定义埋点,请参见常用类及其方法,ContextUtil只在调用链入口生效,即首个埋点生效。
  • 当前账号下已经接入了流量防护的其他应用,填写default即表示不特殊区分。
注意 来源数目不宜过多,200个以内内存使用量可控,过多则会影响性能。
流量示意图
统计维度 选择资源调用关系进行隔离流控。
  • 当前接口:直接控制来自来源应用中调用来源的访问流量,如果来源应用default则不区分调用来源,通常应用于保障自身资源充足的场景,请参见常用场景1 保障自身资源充足
  • 关联接口:控制当前资源的关联资源的流量。通常应用于资源争抢时,留足资源给优先级高接口的场景,请参见常用场景2 有一定相关联性的接口
  • 链路入口:控制该资源所在的调用链路的入口流量。选择链路入口后需要继续配置callstack入口,即该调用链路入口的上下文名称。通常应用于接口有多入口资源的场景,请参见常用场景3 针对入口链路来配置隔离规则
并发数阈值 资源的并发线程数(即该资源正在执行的线程数)阈值。