我在我的laravel应用程序中使用Redis::throttle来限制对各种web服务的请求,但让我们以亚马逊为例。
如果Amazon文档说特定用户可以使用具有以下泄漏存储桶限制的特定端点:允许40个请求,在初始40个请求之后每半秒允许一个新请求。
然后我会让我的Redis::throttle看起来像这样:
$key = 'Amazon|'.$requestType.'|'.$user->id;
Redis::throttle($key)->allow(40)->every(20)->then(function () {
// Job logic...
});每20秒允许40个请求看起来就像是漏桶的定义。但这是对的吗?
因为另一种选择,我想,就是我允许每秒2个请求
Redis::throttle($key)->allow(2)->every(1)但这不允许出现40次的突发事件。
发布于 2020-01-16 18:15:23
我研究了执行Redis::throttle($key)->allow(40)->every(20)时信息是如何存储的,并发现了以下几点:
它以秒为单位存储两个时间戳,一个“开始”和一个“结束”。“start”将是在该键上第一次调用“throttle”时的时间戳,“end”将是开始时间戳+ ->every()中的任何值
1) "start"
2) "1579168555"
3) "end"
4) "1579168575"
5) "count"
6) "1"因此,在本例中,开始值为1579168555,结束值为1579168575
然后它还存储一个计数,该计数在每次后续调用时都会递增,直到传递了时间戳,然后它删除前一个开始/结束/计数并开始一个新的开始/结束/计数。
关于漏桶,这样做的问题是,它实际上允许您执行以下操作:
例如,在timestamp 1579168555
但最后两个步骤是短时间内的79个请求,这是不允许的。
所以实际上我最好是做一些像Redis::throttle($key)->allow(2)->every(1)这样的事情,现在允许突发。throttle接口并没有完全实现漏桶逻辑,但它允许您以一种至少能让您遵守漏桶的方式来限制它。
https://stackoverflow.com/questions/59766819
复制相似问题