内容简介:在我们做社区的时候,经常会出现发水帖的同学。对于这种恶意刷帖的,我们的运营同学很是头疼,而且这种还不能在网关进行ip之类的过滤,只能基于单个单个用户进行处理,我们经常策略就是:每分钟发帖次数不能超过2个,超过后就关小黑屋10分钟。对于这种“黑恶”请求,我们必须要做到是关小黑屋,当然有的系统架构比较大的,在网关层面就已经进行关了,我们这里是会在业务层来做,因为咱业务不是很大,当然同学们也可以把这个移植到网关层,这样不用穿透到我们业务侧,最少能够减少我们机房内部网络流量。以我们场景为例子,使用Redis来做分布
在我们做社区的时候,经常会出现发水帖的同学。对于这种恶意刷帖的,我们的运营同学很是头疼,而且这种还不能在网关进行ip之类的过滤,只能基于单个单个用户进行处理,我们经常策略就是:每分钟发帖次数不能超过2个,超过后就关小黑屋10分钟。
出现场景
- 上面讲的发帖的防刷机制。
- 广告流量的防刷。
- 接口请求失败进行熔断机制处理。
- ......
解决方案
对于这种“黑恶”请求,我们必须要做到是关小黑屋,当然有的系统架构比较大的,在网关层面就已经进行关了,我们这里是会在业务层来做,因为咱业务不是很大,当然同学们也可以把这个移植到网关层,这样不用穿透到我们业务侧,最少能够减少我们机房内部网络流量。
流程图
流程说明
- 接口发起请求,服务端获取这个接口用户唯一标识(用户id,电话号码...).
- 判断该用户是否被锁住,如果锁住就直接返回错误码。
- 未锁住就将该请求标记,亦或者叠加(叠加有坑,往下面看)。
- 进行计算当前用户在一定时间内是否超过我们设置的阈值。如果未超过直接返回。
- 如果超过,那么就进行锁定,再返回,下次请求的时候再进行判断。
具体方案
以我们场景为例子,使用 Redis 来做分布式锁和原子计数器
时间内叠加,判断叠加值是否超过阈值
这个方案,在很多人设计的时候,都会考虑,看起来也没有太大问题,主要流程是:
- 假设我们使用Redis来进行原子计数,每次进来我们进行incr操作,并且将我们的key设置为一个阈值过期时间.
//将我们用户请求量叠加1 $request_nums = Redis::incr('user:1:request:nums',1); //第一次叠加,设置key的过期时间 if ($request_nums == 1){ Redis::expire('user:1:request:nums',300); } if($request_nums > 10){ //加入小黑屋,下次再进来就要锁定判断 } ... 复制代码
- 每次请求会优先进行叠加,然后在这个有效区间内,计算我们的请求次数,如果请求次数超过阈值,那么关小黑屋,要是没有就继续走下去。
问题:咋一看是没有问题,每次计算都在我的区间内,能够保证一个区间内的请求量是没问题的,而且还是要我们Redis的原子计数器,但是这里有一个问题是,一个用户两个时间段内都没有问题,但是跨时间段这个点是没有考虑的。
那么有办法解决这个时间推移问题造成时间段计算量不精准的问题吗?
答案是肯定有,我接下来是使用了Redis的有序集合来做。
请求不进行时间段区分,直接写入有序集合
大致流程:
- 每次请求就写入有序集合里面,集合的sorce值是当前毫秒时间戳(防止秒出现重复),可以认为每一次请求就一个时间戳在里面。
- 从集合里面去掉10分钟以前所有的集合数据。然后计算出当前的集合里面数量
- 根据这个数量来与我们阈值做大小判断,如果超过就锁住,否则继续走下去
//将我们时间戳写入我们redis的有序集合里面 Redis::zadd('user:1:request:nums',1561456435,'1561456435.122'); //设置key的过期时间为10分钟 Redis::expire('user:1:request:nums',300); //删除我们10分钟以前的数据 Redis::ZREMRANGEBYSCORE('user:1:request:nums',0,1561456135); //获取里面剩下请求个数 $request_nums=(int)Redis::zcard(self::TIMELINE_ELEVEL_KEY); if($request_nums >= 10){ //加入小黑屋,下次再进来就要锁定判断 } ... 复制代码
因为我们不是单纯记录数值,而是会将请求时间记录下来,那么随着时间推移,我们的请求数统计是不会断代的。
以上所述就是小编给大家介绍的《接口请求熔断处理机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 微服务分布式系统熔断实战-为何我们需要API级别熔断?
- 聊聊微服务的隔离和熔断
- [译] Istio 熔断器解析
- Spring cloud(4)-熔断(Hystrix)
- 分布式熔断降级平台aegis
- feign使用hystrix熔断的配置
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Thinking Recursively
Eric S. Roberts / Wiley / 1986-1-17 / USD 85.67
The process of solving large problems by breaking them down into smaller, more simple problems that have identical forms. Thinking Recursively: A small text to solve large problems. Concentrating on t......一起来看看 《Thinking Recursively》 这本书的介绍吧!