为应用配置热点规则后,AHAS 将分析统计热点参数(资源调用过程中的调用次数较高的参数),并根据配置的热点规则对包含热点参数的资源调用进行限流,保护系统稳定性。本文介绍如何为应用配置热点规则。

背景信息

热点即经常被访问的数据。在以下场景中需要统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。例如:

  • 针对一段时间内最频繁购买的商品 ID 进行限制,防止击穿缓存打垮 DB
  • 针对一段时间内频繁访问的用户 ID 进行限制,防止恶意刷单。

AHAS 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。

使用说明

将应用接入 AHAS 应用流控降级,具体操作请参见接入应用概述

  • 若您使用接入 Dubbo 应用方式,AHAS 应用流控降级将在方法级别的埋点(即接口名:方法签名),自动按次序传入调用的参数,因此可以直接对调用参数配置热点规则。
  • 若您使用通过注解接入方式,对于 @SentinelResource 注解方式定义的资源,若注解作用的方法上有参数,Sentinel 会将它们作为参数传入 SphU.entry(res, args)。例如以下示例中,uidtype 会分别作为第一个和第二个参数传入 Sentinel API,从而可以用于热点规则判断:
    @SentinelResource(value = "myMethod", blockHandler = "myBlockHandlerFunc")
    public Result doSomething(String uid, int type) {
      // uid 参数索引为 0,type 参数索引为 1
      // some logic here...
    }
  • 对于其它方式接入的应用,您需要自定义埋点传入希望进行热点限流的参数(如 IP、user ID 等)。可以通过 SphU 类
    // name: 资源名称,用于标识该调用。
    // EntryType 用于区分该资源是入口流量(inbound)还是出口流量(outbound),EntryType.IN 代表入口流量,EntryType.OUT 代表出口流量。
    // count 表示每次调用计数为多少,通常传 1
    // args 为传入的参数,用于热点参数限流
    public static Entry entry(String name, EntryType entryType, int count, Object... args) throws BlockException

    args 即待传入的参数,若有多个待传入参数,则按照次序依次传入。例如要传入两个参数 paramA 和 paramB,传入方式如下:

    // paramA 对应的参数索引为 0,paramB 对应的参数索引为 1
    // 若需要配置例外项或者使用集群维度流控,则传入的参数只支持基本类型。
    SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);
    说明 若使用 SphU.entry() 传入了热点参数,那么使用 exit 的时候也要带上对应的参数(exit(count, args)),否则并发线程数等指标会有统计错误。正确使用如下:
    Entry entry = null;
    try {
        entry = SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);
        // 用户的业务逻辑
    } catch (BlockException ex) {
        // 触发限流降级,在此处进行处理。
    } finally {
        if (entry != null) {
            // 务必保证 entry 成功后最终会 exit,并且传入了对应的参数
            entry.exit(1, paramA, paramB);
        }
    }

新建热点规则

  1. 登录 AHAS 控制台
  2. 在 AHAS 控制台左上角,选择应用接入的地域
  3. 在控制台左侧导航栏中选择流控降级 > 应用流控降级
  4. 应用列表页面单击目标应用卡片。
  5. 在左侧导航栏单击规则管理,然后单击热点规则页签。
  6. 热点规则页签右上角单击新增热点限流规则
  7. 新增热点限流规则对话框中,配置规则信息。
    图 1. 新增热点限流规则
    热点限流规则
    • 资源名称:适用该规则的资源名称,与埋点传入的资源名保持一致。
    • 指标项 :可选择 QPS 或并发线程数。
      • QPS:限制一段时间内的调用次数。
      • 并发线程数:限制该资源调用的并发数。
    • 参数索引:埋点传入参数的索引位置。
    • 阈值:是作用于每个热点参数的阈值。
    • 统计窗口时长:统计窗口时间长度(单位为秒)。例如统计窗口时长为 10s,QPS 阈值为 5 代表限制 10s 内每个热点参数访问不超过 5 次。
    • 流控效果:当阈值类型为 QPS 时,可以选择流控效果来处理被拦截的流量。
      • 快速失败:达到阈值时,立即拦截请求。该模式下可以额外设置一个 Burst Size,即针对突发请求额外允许的请求数目。
      • 排队等待:请求匀速通过,允许排队等待,通常用于消息队列削峰填谷等场景。需设置具体的超时时间,排队时会计算预计的排队时长,若超过最大超时时间则请求会直接被拒绝。例如,QPS 配置为 5,则代表请求每 200 ms 才能通过一个,多出的请求将排队等待通过。超时时间配置 1000ms,则若当前排队请求超过 5 个(> 1000 ms),新到来的请求将会直接被拒绝。
      • 是否开启:打开则表示启用该规则,关闭则表示禁用该规则。
  8. 单击新增
  9. 若需对某些特殊的热点参数值单独配置阈值,则在规则列表中单击目标规则操作列的 + 添加例外项,然后在热点规则例外项对话框中单击添加,并填写单独配置的参数信息。编辑例外项
    说明 热点规则例外项仅支持基本类型和字符串类型。由于一条规则只对应一个参数索引位置,因此例外项类型需要保持统一。例如在资源 R 的参数索引 0 处配置一条热点规则,阈值为 5 QPS。若在这条规则新增两条例外项:参数 Sentinel 阈值为 100,参数 AHAS 阈值为 200。则实际生效的时候,其它热点参数会限制每秒钟访问不超过 5 次,而 Sentinel 和 AHAS 这两个参数值作为例外项,会按照对应的例外项阈值生效。

管理热点规则

热点规则页签中,您可以启用、禁用、编辑或删除热点规则。

  • 单热点规则启用/禁用:

    热点规则页签中,找到目标应用下对应的热点规则,单击状态栏的启用开关,可快速启用或禁用该规则。

  • 多个热点规则批量启用/禁用:

    热点规则页签中,勾选多个热点规则,单击批量启用批量禁用,可快速启用或禁用多个规则。

  • 编辑规则:

    热点规则页签中,找到目标应用下对应的热点规则,单击操作栏的编辑,可修改该规则的阈值。阈值类型不允许更改。

  • 删除规则:

    热点规则页签中,找到目标资源下对应的热点规则,单击操作栏的删除