美文网首页
40. 高并发场景下如何实现系统限流

40. 高并发场景下如何实现系统限流

作者: 木叶苍蓝 | 来源:发表于2023-07-25 10:37 被阅读0次

为什么需要限流?以及常见的限流算法有哪些?

常见限流算法

限流通过限制系统的流量,从而实现保护系统的目的
限流需要结合容量规划和压测来进行
当外部请求接近或达到系统的最大阈值时,触发限流,采取其他的手段进行降级
常见的降级策略包括 延迟处理,拒绝服务,随机拒绝等

比如Java 线程池在任务满的情况下,可以配置不同的拒绝策略

  • AbortPolicy——丢弃任务并抛出异常
  • DiscardPolicy——丢弃任务,不抛出异常
  • DiscardOldestPolicy

如何判断当前的流量已经达到我们设置的最大值?

计数器法

进行限流时使用的是单位时间内的请求数,也就是 QPS。统计 QPS 最直接的想法是实现一个计数器

  • 单点限流使用内存
  • 集群限流可以用一个单独的存储节点,比如 Redis 或者 Memcached 进行存储,在固定的时间间隔内设置过期时间

计数器策略缺点——对临界流量不友好,限流不够平滑

假设限制用户一分钟下单不超过10万次,在两个时间窗口的交汇点,前后一秒钟内,分别发送10万次请求
这个峰值可能会超过系统阈值,影响服务稳定性
对计数器算法的优化——避免出现两倍窗口限制的请求,使用滑动窗口算法实现

漏桶和令牌桶算法

漏桶算法是从出口处限制请求速率,请求曲线始终平滑
漏桶算法的一个核心问题——对请求的过滤太精准了

在令牌桶算法中,假设有一个大小恒定的桶,这个桶的容量和设定的阈值有关
通过一个固定的速率,往里面放入令牌,如果桶满了,就把令牌丢掉
最后桶中可以保存的最大令牌数永远不会超过桶的大小
当有请求进入时,尝试从桶里取走一个令牌,如果桶是空的,这个请求就会被拒绝
在 Guava 中,限制策略的工具类 RateLimiter——基于令牌桶算法实现流量限制

不同限流算法的比较

计数器算法适合集群情况下使用,但要考虑临界情况,可以应用滑动窗口策略进行优化

  • 漏桶算法提供了比较严格的限流
  • 令牌桶算法在限流之外,允许一定程度的突发流量

相关文章

  • 高并发架构设计

    面对高并发你怎么处理? 如何设计一个高并发高可用系统? 如何限流?工作中是怎么做的?说一下具体实现? 如何熔断?熔...

  • 令牌桶算法

    Guava RateLimiter 如何解决高并发场景下的限流问题? 令牌桶算法,要想通过限流器,必须拿到令牌。 ...

  • Java限流之令牌桶算法、漏桶算法

    限流在实际使用场景中应用十分广泛,尤其针对并发场景下的高并发,为了保证系统的可用性,我们需要采取一些限流措施降级,...

  • 【181002】高并发场景下的限流策略

    在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。 今天我们来聊聊限流。...

  • 架构成长之路:浅谈高并发场景下的限流策略!

    在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。今天我们来聊聊限流。 ...

  • 架构成长之路:浅谈高并发场景下的限流策略!

    在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。今天我们来聊聊限流。 ...

  • 限流算法:常见的三种限流

    spring Boot 接口如何限流?限流的几种方式 场景 在一个高并发系统中对流量的把控是非常重要的,当巨大的流...

  • 聊聊高并发系统限流特技-2

    转载来自开涛的聊聊高并发系统限流特技-2 上一篇《聊聊高并发系统限流特技-1》讲了限流算法、应用级限流、分布式限流...

  • 聊聊高并发系统之限流特技-2

    摘要:上一篇《聊聊高并发系统限流特技-1》讲了限流算法、应用级限流、分布式限流;本篇将介绍接入层限流实现。 接入层...

  • 分布式系统

    聊聊高并发系统之限流特技

网友评论

      本文标题:40. 高并发场景下如何实现系统限流

      本文链接:https://www.haomeiwen.com/subject/uetaudtx.html