【问题标题】:How to implement Laravel Redis Rate Limiting如何实现 Laravel Redis 速率限制
【发布时间】:2018-05-04 05:11:46
【问题描述】:

尝试实现Rate Limiting 让队列每秒运行一个作业,向外部 API 发出 HTTP 请求并加载一种类型的数据。

但不知道如何调用该工作,尝试了不同的选项但不起作用。在示例中:

Redis::throttle('key')->allow(10)->every(60)->then(function () {
    // Job logic...
}, function () {
    // Could not obtain lock...
    return $this->release(10);
});

// Job logic... 中将放入什么调度队列,并且此代码将在队列类中?以及如何命名key?我的队列名称是loader

有什么帮助吗?

【问题讨论】:

    标签: laravel redis queue throttling


    【解决方案1】:

    把它放在Job的handle方法里面。

    public function handle() {
        Redis::throttle('key')->allow(10)->every(60)->then(function () {
            // Job logic...
        }, function () {
            // Could not obtain lock...
            return $this->release(10);
        });
    }
    

    键应该是任何唯一的字符串。它将识别限制:“allow(10)->every(60)”。

    【讨论】:

    • gist.github.com/meathanjay/3ab3a40efe5a67bce840b69f310590d8 这里是handle 方法的示例实现,密钥是唯一的,但它没有通过限制,每 60 秒 10 个,而是立即执行
    • 对于 Laravel 5.3 中的一些人,我们有什么替代方案?
    • @Meathanjay 我认为关键是你的问题:它应该是每种工作类型的唯一,而不是每个工作实例。因此,每个作业都有唯一的键,永远不会发生限制,因为永远不会达到限制..
    • @Laraleg 你能解释一下这部分的作用吗? $this->release(10); 并且,release 方法中的 arg 是否始终与 allow 方法中的相同?
    • @andrux 它将作业放回队列以在 10 秒内处理
    【解决方案2】:

    您还可以使用此软件包对 Redis 或其他资源进行速率限制。使用设置将存储桶大小和速率设置为时间限制的分数,因此存储空间非常小。

    composer require bandwidth-throttle/token-bucket
    

    https://github.com/bandwidth-throttle/token-bucket

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2020-10-04
      • 2021-12-12
      • 1970-01-01
      • 2022-08-22
      • 2021-07-09
      相关资源
      最近更新 更多