龙空技术网

一文读懂分布式限流算法:令牌桶、漏桶等常见的算法

博文小火柴 168

前言:

目前看官们对“动态令牌算法有哪些”大概比较关注,大家都想要分析一些“动态令牌算法有哪些”的相关文章。那么小编同时在网上汇集了一些对于“动态令牌算法有哪些””的相关知识,希望大家能喜欢,小伙伴们一起来了解一下吧!

限流是指,如果请求量超过阈值,则将请求排队或者丢弃,以减轻对业务系统的压力。

分布式限流最关键的是实现限流服务的原子化,常见的限流算法有令牌桶、漏桶等,Spring Cloud Gateway使用Redis+Lua技术实现高并发和高性能的限流方案。

令牌桶是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:

假如用户配置的平均速率为r,则每隔1/r秒1个令牌被加入桶,假设桶中最多可以存放b个令牌。

如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃,当一个n字节大小的数据包到达时,将从桶中删除n个令牌,接着数据包被发送到网络上。如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在流量限制之外。

令牌桶算法允许最多b个令牌的突发流量,但从长期运行结果来看,数据包的速率被限制成常量r。对于在流量限制外的数据包,可以以不同的方式处理:

它们可以被丢弃。它们可以排放在队列中以便当令牌桶中累积了足够多的令牌时再传输。它们可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃。

令牌桶算法的示意图如图2-12所示。

漏桶作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic ShAping)和流量控制(Traffic Policing),漏桶算法的描述如下:

一个固定容量的漏桶按照固定速率流出水滴,如果桶是空的,则不需流出水滴,可以以任意速率流入水滴到漏桶中,如果流入漏桶中的水滴超出了漏桶的容量,则流入漏桶中的水滴溢出了(被丢弃),而漏桶容量是不变的。

漏桶算法的示意图如图2-13所示。

在Spring Cloud Gateway中有Filter过滤器,因此可以在“pre”类型的Filter中自行实现限流。限流作为网关最基本的功能,Spring Cloud Gateway官方就提供了RequestRateLimiter- GatewayFilterFactory这个类,使用Redis+Lua脚本实现了令牌桶的方式。具体实现逻辑在RequestRateLimiterGatewayFilterFactory类中,读者可以自行查看具体源码。下面以案例的形式讲解如何在Spring Cloud Gateway中使用内置的限流过滤器工厂来实现限流。

内容摘自《支付架构实战》,作者苏博亚,支付领域资深技术专家,在支付行业深耕十余年,先后在随行付支付有限公司、美团、有赞科技从事支付业务的开发、设计、架构工作。获得认证:

PMP(项目管理人士资格认证)

OCP(Oracle数据库认证专家)

标签: #动态令牌算法有哪些