速率限制是控制服务资源利用和质量的重要机制。基于协程、通道和打点器,Go优雅的支持速率限制。
首先,我们将看一个基本的速率限制。假设我们想限制对收到请求的处理,我们可以通过一个渠道处理这些请求。
limiter通道每200ms接收一个值。这是我们任务速率限制的调度器。
通过在每次请求前阻塞limiter通道的一个接收,可以将频率限制为,每200ms执行一次请求。
有时候我们可能希望在速率限制方案中允许短暂的并发请求,并同时保留总体速率限制。我们可以通过缓冲通道来完成次任务。burstyLimiter通道允许最多3个爆发(bursts)时间
填充通道,表示允许的爆发(bursts)
每200ms我们将尝试添加一个新到值到burstyLimiter中个,直到达到3个的限制。
现在,模拟另外5个传入请求。收益于burstyLimiter的爆发(bursts)能力,前3个可以快速完成。
运行程序,我们看到第一批请求意料之中的大约每200ms处理一次。
第二批请求,由于爆发速率控制,我们直接连续处理3个请求,然后以大约每200ms一次的速度,处理了剩余的2个请求。