资讯专栏INFORMATION COLUMN

限流处理

Wuv1Up / 821人阅读

摘要:如果一直优先处理高优先级的队列,等这个队列的请求处理完了,再处理优先级低一级的请求,那么优先级低的队列可能要等很久才能处理。参考弹力设计之限流设计陈皓

调用配额

之前一篇文章到通过access key调用API的方式,这种调用方式难免会碰到一个问题,那就是,如果用户不挺地高频率调用API,服务器是否会过载,如果过载了,是否会影响内部服务。

有个做法,就是给access key设置调用配额(limit,duration),这个配额指的是在某个时间段内(duration),调用的次数不能超过limit指定的数额。如果超过了,则拒绝服务。这种可以通过缓存来实现,利用缓存的expire时间,并且维持一个计数器,每当调用一次,则计数器减一。

def init(access_key, limit, duration):
    memcache.set(key=access_key, val=limit, expire=duration)

def handle(access_key):
    count = memcache.get(key=access_key)
    if count == 0:
        return "DENY"
    memcache.decr(key=access_key)
    return "OK"

前面init函数做初始化,后面handle函数对请求做判断,每掉用一次,就把计数器减一;如果当前计数器里的值为0,则拒绝服务。

使用配额的目的是:对于一些高级客户,可以提高配额,以提高体验。如果是内部服务调用,那么这个配额,可以提高些。

请求队列

可以提供不同优先级的队列,针对不同的请求的优先级,把他们放到不同的队列里,先处理优先级高的队列,然后优先级更低的队列。(可以用redis里的有序队列来实现?)如果有针对这个队列的处理服务,这个服务能够合并请求,那么则可以减轻后端服务的负载。

student:
{
    "name": "ABC",
    "age": 30,
}
requests:
[0] {"action": "ModifyItems", "name": "xiao ming"}
[1] {"action": "ModifyItems", "age": 26}

After handled
new request:
[0] {"action": "ModifyItems", "age": 26, "name": "xiao ming"}

如上,如果数据库里有一个对象student,通过请求ModifyItems可以修改student属性,请求队列如requests所示,第一个请求修改了name,第二个请求修改了age,这个时候,可以把这2个请求合并成一个,这个新的请求跟两个请求最终达到的小姑都是一样的,所以是可行的。

如果一直优先处理高优先级的队列,等这个队列的请求处理完了,再处理优先级低一级的请求,那么优先级低的队列可能要等很久才能处理。

这个时候,可以根据权重来处理,如果优先级队列有2个,他们优先级分别是:2和1,数值越高,表示优先级更高,那么根据优先级权重,服务器先处理优先级高的队列里的2个请求,然后再去处理优先级低队列里的1个请求,优先级低的队列则不会被饿死。

参考:《弹力设计之“限流设计”》陈皓

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61995.html

相关文章

  • 这个注解一次搞定限流与熔断降级:@SentinelResource

    摘要:实现熔断降级注解除了可以用来做限流控制之外,还能实现与类似的熔断降级策略。函数签名要求返回值类型必须与原函数返回值类型一致方法参数列表需要为空,或者可以额外多一个类型的参数用于接收对应的异常。若未配置和,则被限流降级时会将直接抛出。 在之前的《使用Sentinel实现接口限流》一文中,我们仅依靠引入Spring Cloud Alibaba对Sentinel的整合封装spring-clo...

    Lionad-Morotar 评论0 收藏0
  • 几种限流技术

    摘要:下面是几种常见的限流技术一限流算法常用的限流算法有令牌桶,漏桶令牌桶令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。 就秒杀接口来说,当访问频率或者并发请求超过其承受范围的时候,这时候我们就要考虑限流来保证接口的可用性,以防止非预期的请求对系统压力过大而引起的系统瘫痪。通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务。下面是几种常见的限流技术 一、限流算法常用的限流算...

    Warren 评论0 收藏0
  • 【Nginx源码研究】nginx限流模块详解

    摘要:限流算法最简单粗暴的限流算法就是计数器法了,而比较常用的有漏桶算法和令牌桶算法计数器计数器法是限流算法里最简单也是最容易实现的一种算法。 运营研发团队 李乐 高并发系统有三把利器:缓存、降级和限流; 限流的目的是通过对并发访问/请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页)、排队等待(秒杀)、降级(返回兜底数据或默认数据); 高并发系统常见的限流有:限制总并发...

    voyagelab 评论0 收藏0
  • 分布式系统关注点——想通关「限流」?只要这一篇

    摘要:之前有了解到哥的一部分读者们没有充分搞清楚限流和熔断的关系。后者表示系统在同一时刻能处理的最大请求数量,比如次的并发。后续限流策略需要设定的具体标准数值就是从这些指标中来的。限流阈值不继续处理请求。 如果这是第二次看到我的文章,欢迎扫描文末二维码订阅我哟~本文长度为2869字,建议阅读8分钟。 可能你在网上看过不少「限流」相关的文章,但是z哥的这篇可能是最全面,最深入浅出的一篇了(容我...

    CollinPeng 评论0 收藏0
  • 限流器及Guava实现分析

    摘要:计数限流算法无论固定窗口还是滑动窗口核心均是对请求进行计数,区别仅仅在于对于计数时间区间的处理。令牌桶限流实现原理令牌桶限流的实现原理在有详细说明。因此由此为入口进行分析。目前可返回的实现子类包括及两种,具体不同下文详细分析。 限流 限流一词常用于计算机网络之中,定义如下: In computer networks, rate limiting is used to control t...

    xcc3641 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<