Мидлвар для ограничения очередей

Мидлвар для ограничения очередей

Недавно мы выпустили новый пакет для ограничения количества выполнений задач за определенный промежуток времени под названием laravel-rate-limited-job-middleware. И в этой короткой статье я хотел бы ознакомить вас с ним.

Варианты использования

Сейчас я работаю над новым пакетом для рассылки писем списку подписчиков. Письма отправляются с использованием нескольких служб, поддерживаемых Laravel. Все письма отправляются через очередь.

Службы отправки писем часто имеют ограничение на количество, которые вам разрешено отправлять за короткий промежуток времени. Поэтому мне нужен был способ ограничить количество задач в определенный промежуток времени.

В Laravel 6 появился мидлвар задач (job middleware). Пример в документации показывает, как регулировать задачи через Redis. Это было именно то, что мне было нужно, поэтому я сделать пакет. Плюс добавил несколько методов для настройки поведения.

Представляю Laravel-Rate-Limited-Job-Middleware

Пакет может быть установлен через Composer (тут без сюрпризов)

composer require spatie/laravel-rate-limited-job-middleware

Вы можете использовать мидлвар RateLimited просто возвращая его в методе middleware.

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Spatie\RateLimitedMiddleware\RateLimited;

class TestJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable;

    public function handle()
    {
        // логика вашей задачи
    }

    public function middleware()
    {
        return [new RateLimited()];
    }
}

По умолчанию будет разрешено выполнять только пять задач в секунду.

Конечно, вы можете изменить это поведение. Вот пример, где разрешено 30 заданий за 60 секунд. Избыток задач будет высвобожден для перезапуска через 90 секунд.

// в вашей задаче

public function middleware()
{
    $rateLimitedMiddleware = (new RateLimited())
        ->allow(30)
        ->everySeconds(60)
        ->releaseAfterSeconds(90);

    return [$rateLimitedMiddleware];

При использовании ограничения скорости сложно предсказать количество попыток выполнения задачи. Вместо использования фиксированного количества попыток, лучше использовать попытки, основанные на времени.

В заключение

Пакет также содержит и другие интересные методы. Чтобы узнать о них, ознакомьтесь с документацией на GitHub .

Автор: Freek Van der Herten
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.