c++ 分布式令牌桶_分布式之流量控制

c++ 分布式令牌桶_分布式之流量控制_第1张图片

最近在做数据对外服务的功能,涉及到针对某个用户或者某个API的流量控制。说到流量控制,最常想到就是平时使用的带宽限速,实现起来也有几种常见的方法:消息队列、漏斗策略和令牌桶算法。

方法1:消息队列

c++ 分布式令牌桶_分布式之流量控制_第2张图片

为了实现流量控制,可以在服务端处理前先保存到消息队列中,服务器再慢慢消费。不过这种方案请求都放在一个消息队列中,可能会造成消费不及时,客户端访问超时,所以比较适合不需要快速响应的场景。

方法2:漏斗策略

c++ 分布式令牌桶_分布式之流量控制_第3张图片

这种方法是上面的变种,即在服务器接收也是用一个缓冲池,这个缓冲池有个固定的大小,无论请求的速度多大,都按照固定的速度处理。如果请求量过多,缓冲池无法处理,就会直接抛出限速等错误提示。因此这种方式虽然能处理一些比较大的流量,但是处理速度总是不变,缺乏一定的灵活性。

漏斗策略其实好处很明显,可以辅助进行”流量调整“,无论流量洪峰有多大,服务器的处理都不会受到影响,保证一部分用户的访问正常可用。缺点是当流量过大时,一部分流量会处理延迟或得不到处理。因此比较适合间歇性的流量波动,当流量高峰时流量暂缓处理保存下来,在流量低谷或者空闲时进行处理。

参考项目如阿里的Sentinel以及分布式追踪框架Jaeger。

方法3:令牌桶策略

c++ 分布式令牌桶_分布式之流量控制_第4张图片

令牌桶算法会为每个用户创建一个令牌桶,当请求到达时,需要到令牌桶中申请一个令牌,使用完毕把令牌放回。这样可以实现控制某个用户的最高并发访问。非常适合针对某个用户进行的流量控制。

参考项目如Guava的RateLimiter。

你可能感兴趣的:(c++,分布式令牌桶)