高并发流量控制

Posted juncaoit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发流量控制相关的知识,希望对你有一定的参考价值。

  以前没关注过,这里只学的是单机的处理方式。

1.什么是大流量

  大流量,我们很可能会冒出:TPS(每秒事务量),QPS(每秒请求量),1W+,5W+,10W+,100W+...。

  其实并没有一个绝对的数字,如果这个量造成了系统的压力,影响了系统的性能,那么这个量就可以称之为大流量了。

 

2.应对大流量常用方式

  缓存:说白了,就是让数据尽早进入缓存,离程序近一点,不要大量频繁的访问DB。

  降级:如果不是核心链路,那么就把这个服务降级掉。打个比喻,现在的APP都讲究千人千面,拿到数据后,做个性化排序展示,如果在大流量下,这个排序就可以降级掉!

  限流:想法很直接,就是想在一定时间内把请求限制在一定范围内,保证系统不被冲垮,同时尽可能提升系统的吞吐量。

    注意到,有些时候,缓存和降级是解决不了问题的,比如,电商的双十一,用户的购买,下单等行为,是涉及到大量写操作,而且是核心链路,无法降级的,这个时候,限流就比较重要了。

 

3.限流

  限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。

 

4.计数器

  计数器是一种比较简单的限流算法,用途比较广泛,在接口层面,很多地方使用这种方式限流。在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。

  这段程序是拷贝的,我感觉这段的意思是,如果在这段时间内超过了一定的值,就开始使用限流的逻辑处理(这个地方应该才是重点,计数器是一个壳子)。

  技术分享图片

 

5.活动窗口

  由于计数器存在临界点缺陷,后来出现了滑动窗口算法来解决。

  滑动窗口的意思是说把固定时间片,进行划分,并且随着时间的流逝,进行移动,这样就巧妙的避开了计数器的临界点问题。也就是说这些固定数量的可以移动的格子,将会进行计数判断阀值,因此格子的数量影响着滑动窗口算法的精度。

  技术分享图片

  我感觉应该像通信中的滑动窗口。

 

6.漏桶

  虽然滑动窗口有效避免了时间临界点的问题,但是依然有时间片的概念,而漏桶算法在这方面比滑动窗口而言,更加先进。

  有一个固定的桶,进水的速率是不确定的,但是出水的速率是恒定的,当水满的时候是会溢出的。

  技术分享图片

 

7.令牌桶

  注意到,漏桶的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。为了解决这个问题,令牌桶进行了算法改进。

  技术分享图片

  生成令牌的速度是恒定的,而请求去拿令牌是没有速度限制的。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,而且拿令牌的过程并不是消耗很大的事情。

  技术分享图片

 

 

 

  

 

以上是关于高并发流量控制的主要内容,如果未能解决你的问题,请参考以下文章

架构设计 | 高并发流量削峰,共享资源加锁机制

架构设计 | 高并发流量削峰,共享资源加锁机制

Java Semaphore实现高并发场景下的流量控制(附源码) | 实用代码架构

Sentinel流量控制规则

秒杀系统设计四——流量控制

BeetleX服务网关流量控制