突然来了大量客户请求,我们无法判断这些请求是正常的,还是客户被攻击所致。为了避免产生严重客损,我们需要识别到这些突然出现的流量高峰,并进行通知以及执行一些处理措施。
客户配置
比如:
request_limit = {
rate: {
// 客户配置
3600: 1000, // 指定 API 1 小时之内的请求量上限
86400: 8000, // 指定 API 1 天之内的请求量上限
},
rate_computed: {
// 根据之前的请求情况,结合客户配置计算出来的值(不小于客户配置)
3600: 1000,
86400: 8000,
},
strategy: {
times_to_notify: 1, // 连续触发几次之后通知
times_to_suspend: 3, // 连续触发几次之后暂停
times_to_intercept: 12, // 连续触发几次之后拦截请求
},
};
- 默认给所有客户开启最近 1 小时和最近 24 小时的限制。
- 速率控制以小时为单位(
[1, 24]
)
定时检查
- 定时执行
5 10 15 20 25 30
35 40 45 50 55 0
-
查询过去 1 天有请求的客户清单,根据系统参数(可能还有业务上其他条件)跳过忽略检查客户
-
逐个客户查询最近 5 分钟内的请求量,并将 5 分钟数据统计到小时内
然后逐个时间区间配置,判断总请求量是否超出预设值
end_min = (minute // 5) * 5
start_min = end_minute - 5
- 如果流量异常,按照指定策略触发相关事件
客户处理
PS:这个机制的目的是处理异常流量,如果正常的请求量上来了应该调整客户配置。
- 警告页面给出客户过去的请求情况,标出告警时间段的数据
- 让客户选择处理方案:
- 忽略并继续
- 清空暂停队列并继续
可以查看下载受影响的请求信息 - 暂不处理
- 往后 24 小时之内,下一次触发告警的数量,提供一个默认值(当前请求量的 1.5 倍)
另一种思路:如果客户选择继续请求,不用填下一次告警的数量,后面计算的时候直接跳过过去一段时间(比如 6 小时)的请求量。