1、背景
在当今的互联网应用中,单机数据处理系统已经很难满足性能需求了,高可用、横向扩展能力几乎是所有应用的标准配置。而如何针对这些分布式系统的所有数据处理节点进行全局的流量控制,避免系统压力过大,或者是控制用户访问频率,又是一个非常常见的需求。
在一些分布式系统中,可能需要针对每个用户进行限流,例如API网关,因此通常API网关上都会增加一个模块用以进行流量控制。现在比较流行的流量控制算法是令牌桶,但是这种方法并不能均匀地分配令牌,因为每次下发的令牌都是批量下发的,有可能会造成用户在某些数据处理节点上有足够令牌能访问,而在某些数据处理节点上因为缺乏令牌而无法访问的情况,这在大多数场景下不是问题,例如仅仅是为了减轻系统压力,但是在某些场景下不能满足需求,例如用户已按使用频率付费每分钟1万次,在还没将请求许可消费完之前就拒绝访问是不合理的。图1为令牌桶算法限流方案。
2、问题
在一些分布式系统中,可能需要针对每个用户进行限流,例如API网关,因此通常API网关上都会增加一个模块用以进行流量控制。现在比较流行的流量控制算法是令牌桶,但是这种方法并不能均匀地分配令牌,因为每次下发的令牌都是批量下发的,有可能会造成用户在某些数据处理节点上有足够令牌能访问,而在某些数据处理节点上因为缺乏令牌而无法访问的情况,这在大多数场景下不是问题,例如仅仅是为了减轻系统压力,但是在某些场景下不能满足需求,例如用户已按使用频率付费每分钟1万次,在还没将请求许可消费完之前就拒绝访问是不合理的。图1为令牌桶算法限流方案。
3、解决方案
本方案提出一种基于准实时统计的方法,对当前的访问状态进行统计,并根据统计结果和请求许可消费状态下发拦截指令,达到准确的流量控制的目标。
该方案的核心是如何实现准实时的统计,而该准实时统计的核心思想就是:将用户请求作为原始数据,先本地聚合,减少数据量,再进行全局的聚合,得到最后的统计结果。其中的统计方式,使用基础统计数据+增量统计数据的方式以达到本地即时统计的效果。