AHAS 应用流控降级可以根据服务提供方的能力和服务消费方的分配能力进行流量控制。其中服务提供方(Service Provider)是指对外提供请求的服务或应用;服务消费方(Service Consumer)是指调用该服务的下游应用。

根据服务提供方限流

为了保护服务提供方不被激增的流量拖垮影响稳定性,您可以为其配置 QPS 模式的流控规则。当每秒的请求量超过设定的阈值时,AHAS 将拒绝多余的请求。提供方限流可以分为服务接口限流和服务方法限流。

  • 服务接口限流:适用于整个服务接口的 QPS 不超过一定数值的情况。例如:为对应服务接口资源配置 QPS 阈值。
  • 服务方法限流:适用于服务的某个方法的 QPS 不超过一定数值的情况。例如:为对应服务方法资源配置 QPS 阈值。

示例:

若应用 A 为服务提供方,其 Web 接口 /queryData对应的方法是queryData(java.lang.String)。假设应用 A 最多每秒只能承受 10 次调用。若调用次数超过,则应用 A 宕机。

ex_1

针对此类场景,可以对应用 A 按服务方法粒度设置流控规则,限制 queryData(java.lang.String) 方法每秒最多只能被调用 10 次,具体操作步骤,参见新建流控规则。若超过阈值,消费方将会收到一个 BlockException 异常,并且快速返回。

根据服务消费方限流

根据消费方限流是指根据调用方的需求来分配服务提供方的处理能力。

说明 若限流规则未设置调用方(default),则该限流规则对所有调用方生效。若限流规则设置了调用方,则限流规则仅对指定调用方生效。

示例:

有两个服务消费者 A 和 B 都向服务提供方发起调用请求,我们希望优先服务消费方 A,而只对来自消费方 B 的请求进行限流。通过对消费方 B 设置限流规则(limitApp)来实现这个目的。

ex_2

对于默认框架例如 Dubbo,AHAS 会自动解析 Dubbo 消费方的 application name 作为调用方名称(origin),在进行资源保护的时候都会带上调用方名称。而对于非默认框架,只需要在 Sentinel 原有的代码中加入 ContextUtil.enter(resourceName, origin)ContextUtil.exit() 即可。示例代码如下:

Entry entry = null;

//这里代表消费者 A 的调用
ContextUtil.enter(queryData, "A");

try {
  // 资源名可使用任意有业务语义的字符串
  entry = SphU.entry("queryData");
  // 被保护的业务逻辑
  // do something...
} catch (BlockException e1) {
  // 资源访问阻止,被限流或被降级
  // 进行相应的处理操作
} finally {
  if (entry != null) {
    entry.exit();
  }
}
//调用结束
ContextUtil.exit();
说明 ContextUtil.enter(xxx) 方法仅在初次调用链路入口时才生效,可参考相关 API 文档

更多设置

限流规则中的 limitApp(针对来源)支持以下三种选项,分别对应不同的场景:

  1. default:适用于不区分消费者的场景。来自任何调用者的请求都将进行限流统计。如果这个资源名的调用总和超过了这条规则定义的阈值,则触发限流。
  2. {some_origin_name}:适用于对特定的消费者限流的场景。只有来自这个调用者的请求才会进行流量控制。

    例如,资源 A 配置了一条针对消费者 caller1 的规则,那么当且仅当来自消费者 caller1 对资源 A 的请求才会触发流量控制。

  3. other:表示针对除 {some_origin_name} 以外的其余调用方的流量进行流量控制。这个场景适用于资源对大部分消费者都有一个通用的阈值,对特定消费者有不一样的阈值的场景。
    例如,资源 A 可以对大部分消费者可以每秒提供 10 个请求,但是对于消费者 caller1 是个例外,对 caller1 ,每秒可以提供 200 个请求。需配置两条规则,说明如下:
    • 为消费者 caller1 配置一条 limitApp 为 caller1 的限流规则,这条规则每秒的最大请求量设置为 200;
    • 同时,配置一条limitApp为 other 的规则,这条规则每秒的最大请求量设置为 10,那么任意来自非 caller1 对该 resource 的调用,都不能超过 10。
说明 同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default。