首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否正确地考虑了Redis::throttle?

我是否正确地考虑了Redis::throttle?
EN

Stack Overflow用户
提问于 2020-01-16 17:49:01
回答 1查看 94关注 0票数 0

我在我的laravel应用程序中使用Redis::throttle来限制对各种web服务的请求,但让我们以亚马逊为例。

如果Amazon文档说特定用户可以使用具有以下泄漏存储桶限制的特定端点:允许40个请求,在初始40个请求之后每半秒允许一个新请求。

然后我会让我的Redis::throttle看起来像这样:

代码语言:javascript
复制
    $key = 'Amazon|'.$requestType.'|'.$user->id;
    Redis::throttle($key)->allow(40)->every(20)->then(function () {
        // Job logic...
    });

每20秒允许40个请求看起来就像是漏桶的定义。但这是对的吗?

因为另一种选择,我想,就是我允许每秒2个请求

代码语言:javascript
复制
Redis::throttle($key)->allow(2)->every(1)

但这不允许出现40次的突发事件。

EN

回答 1

Stack Overflow用户

发布于 2020-01-16 18:15:23

我研究了执行Redis::throttle($key)->allow(40)->every(20)时信息是如何存储的,并发现了以下几点:

它以秒为单位存储两个时间戳,一个“开始”和一个“结束”。“start”将是在该键上第一次调用“throttle”时的时间戳,“end”将是开始时间戳+ ->every()中的任何值

代码语言:javascript
复制
1) "start"
2) "1579168555"
3) "end"
4) "1579168575"
5) "count"
6) "1"

因此,在本例中,开始值为1579168555,结束值为1579168575

然后它还存储一个计数,该计数在每次后续调用时都会递增,直到传递了时间戳,然后它删除前一个开始/结束/计数并开始一个新的开始/结束/计数。

关于漏桶,这样做的问题是,它实际上允许您执行以下操作:

例如,在timestamp 1579168555

  • Wait 15秒时发出1个请求,然后在timestamp 1579168570

  • Wait 6秒时发出39个请求,现在
  • 键被清除,现在您可以发出40个request

但最后两个步骤是短时间内的79个请求,这是不允许的。

所以实际上我最好是做一些像Redis::throttle($key)->allow(2)->every(1)这样的事情,现在允许突发。throttle接口并没有完全实现漏桶逻辑,但它允许您以一种至少能让您遵守漏桶的方式来限制它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59766819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档