Skip to content

热点参数限流

Eric Zhao edited this page Jun 19, 2020 · 9 revisions

Overview

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

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

Sentinel 通过埋点的形式,在每次 Entry(opts) 的时候携带上需要流控的参数。具体可以参考:api/api.go/#func WithArgs(args ...interface{}) EntryOption 函数

WithArgs 函数携带的是一个参数列表。Sentinel 的热点参数流控的每个规则会对参数列表中某一位置的参数生效(根据热点参数流控规则中的参数列表 index 属性来指定生效参数位置)。Sentinel 会为每个规则都创建独立的统计结构,统计结构会缓存对应参数列表的 index 的所有值,根据值的统计做流控。

这里举个例子:假设每次 Entry 的时候携带上的参数列表是:[string, int]。现在有一个规则 R1 在 index 是 0 的位置生效,规则基于并发数去做控制,限制最高并发是 100。 那么 Entry 的时候携带上的参数列表 ["sentinel", any number],第一个参数出现 "sentinel" 的请求,并发量不超过 100。

规则设置

Rule 的定义参考:hotspot.Rule

属性 说明 是否必填项 默认值
Resource 资源名 必填
MetricType 流控指标类型 (MetricType),支持两种:请求数和并发数 必填
ControlBehavior 流控的效果 (ControlBehavior),仅在请求数模式下有效。支持两种:快速失败和匀速+排队模式 必填
ParamIndex 热点参数的索引,对应 WithArgs(args ...interface{}) 中的参数索引位置,从 0 开始 必填
Threshold 限流阈值(针对每个热点参数) 必填
MaxQueueingTimeMs 最大排队等待时长(仅在匀速排队模式 + QPS 下生效) 选填
BurstCount 静默值(仅在快速失败模式 + QPS 下生效) 选填
DurationInSec 统计结构刷新 token 的间隔 (仅在请求数流控模式下生效) 选填
ParamsMaxCapacity 统计结构的容量最大值(Top N) 选填
SpecificItems 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 Threshold 阈值的限制。仅支持基本类型和字符串类型 选填

示例

可参考 example 代码:https://github.com/alibaba/sentinel-golang/blob/master/example/hotspot_param_flow/hotspot_param_flow_example.go