Laravel队列速率限制不执行工作

时间:2019-03-01 01:02:56

标签: php laravel laravel-queue

我正在尝试实现https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/03/14/how-to-configure-network-for-azure-sql-managed-instance/,以供队列作业达到速率受限的外部API时使用。

这是我的工作:

    public function handle() {
        echo 'about to check throttling'.PHP_EOL;
        Redis::throttle('throttle-test')->allow(10)->every(5)->then(function () {
            // this is never executed
            echo 'doing work'.PHP_EOL;
        }, function () {
            // also never executed
            echo 'released back onto queue'.PHP_EOL;
            return $this->release(10);
        });
    }

除了“ ...应用程序可以与Redis服务器交互”之外,没有提到需要在文档中使用Redis进行队列,缓存或任何类似性质的操作。无论哪种方式,这都是我的环境变量:

DB_CONNECTION=mysql
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=redis

我已经确认RedisServiceProvider收到了预期的正确配置:

array:3 [
  "client" => "predis"
  "default" => array:4 [
    "host" => "redis"
    "password" => null
    "port" => "6379"
    "database" => 0
  ]
  "horizon" => array:5 [
    "host" => "redis"
    "password" => null
    "port" => "6379"
    "database" => 0
    "options" => array:1 [
      "prefix" => "horizon:"
    ]
  ]
]

我正在努力理解为什么没有运行时错误,只是什么都没有执行。如果我把节流阀的东西注释掉,则工作运行正常,并且可以完成预期的工作。 我对使用此限制的要求缺少什么?

2 个答案:

答案 0 :(得分:7)

在这种情况下,Laravel的文档具有很大的误导性。虽然这意味着您仅需要连接到#include <locale.h> #include <stdio.h> #include <wchar.h> #include <wctype.h> int main(void) { setlocale(LC_ALL, ""); wchar_t sentence[30]; wprintf(L"Gimme a sentence:\n"); wscanf(L"%l29[^\n]", sentence); //Reading the line wprintf(L"Your sentence: %ls\n", sentence); //Printing the whole line wprintf(L"Detecting non-alphabetic wide characters"); //Detecting non-alphabetic characters for (int i = 0; sentence[i]; i++) { if (iswalpha(sentence[i]) == 0) { wprintf(L"\n\"%lc\" %i\n", sentence[i], i); wprintf(L"An illegal character has been detected here"); return 1; } } return 0; } ,但实际上您必须为队列使用Redis

答案 1 :(得分:0)

不幸的是,如果不使用Redis队列驱动程序,就没有“正式”的方法来限制队列的速率。

我写了一个自定义队列工作器mxl/laravel-queue-rate-limit,它使用Illuminate\Cache\RateLimiter来对作业的执行进行速率限制(与Laravel在rate limit HTTP requests内部使用的相同)。

GitHub pagethis SO answer上详细了解其用法。