Laravel 队列速率限制或节流

Mea*_*jay 9 queue laravel laravel-5 laravel-queue

我正在开发一个需要从第三方服务器获取数据的应用程序,并且该服务器每秒最多允许 1 个请求。

现在,所有请求都作为作业发送,我正在尝试实施 Laravel 的“速率限制”以每秒发布 1 个作业,但无法弄清楚为什么应该实施它,并且网络中没有实际示例。

有人实施了吗?

这有什么暗示吗?

mix*_*xel 7

我是mxl/laravel-queue-rate-limit Composer 包的作者。

它允许您在不使用 Redis 的情况下对特定队列上的作业进行速率限制。

  1. 安装它:

    $ composer require mxl/laravel-queue-rate-limit:^1.0
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这个包与 Laravel 5.5+ 兼容,并使用自动发现功能添加MichaelLedin\LaravelQueueRateLimit\QueueServiceProvider::class到提供者。

  3. 将速率限制设置添加到config/queue.php

    'rateLimit' => [
        'mail' => [
            'allows' => 1,
            'every' => 5
        ]
    ]
    
    Run Code Online (Sandbox Code Playgroud)

    这些设置允许每 5 秒在mail队列上运行 1 个作业。确保默认队列驱动程序(default属性 in config/queue.php)设置为除sync.

  4. 使用--queue mail选项运行队列工作器:

    $ php artisan queue:work --queue mail
    
    Run Code Online (Sandbox Code Playgroud)

    您可以在多个队列上运行 worker,但只有在rateLimit设置中引用的队列才会受到速率限制:

    $ php artisan qeueu:work --queue mail,default
    
    Run Code Online (Sandbox Code Playgroud)

    default队列上的作业将在没有速率限制的情况下执行。

  5. 将一些作业排队以测试速率限制:

    SomeJob::dispatch()->onQueue('mail');
    SomeJob::dispatch()->onQueue('mail');
    SomeJob::dispatch()->onQueue('mail');
    SomeJob::dispatch();
    
    Run Code Online (Sandbox Code Playgroud)


Mar*_*łek 0

假设你只有一个工人,你可以这样做:

  • 做必须做的事
  • 获取时间(以微秒为单位)
  • 睡眠时间为 1 秒减去结束时间和开始时间之间的差值

所以基本上:

doSomething()
$time = microtime(true);
usleep(1000 - ($time - LARAVEL_START));
Run Code Online (Sandbox Code Playgroud)