Laravel 9 Rate Limiter для заданий (jobs)
Столкнулся с проблемой задания лимитов для Job
в Laravel 9
.
Хочу задать лимиты для заданий, с учетом пользователей.
Делаю так как в документации написано.
Первый шаг.
В провайдере задаю поминутный лимит для каждого пользователя (Задаю id
пользователя как ключ)
namespace App\Providers;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->register(RepositoryServiceProvider::class);
$this->app->register(RequestValidationProvider::class);
$this->app->register(CustomServiceProvider::class);
}
public function boot(): void
{
RateLimiter::for('Limiter', function (object $job) {
Log::info($job->userId);
return Limit::perMinute(10)->by($job->userId)->response(function() {
Log::info('Too many attempts!');
});
});
}
}
Следующий шаг добавить в само задание метод middleware
с тем именем RateLimiter
-а который мы создали в AppServiceProvider
.
Вот сам код задания.
namespace App\Jobs;
use App\Services\Crm\ServiceFactory;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\Middleware\RateLimitedWithRedis;
class SendEmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(
private readonly string $crmSlug,
private readonly array $email,
public readonly int $userId
){}
public function handle(ServiceFactory $serviceFactory): void
{
$service = $serviceFactory->get($this->slug);
$service->sendEmail($this->email);
}
public function middleware(): array
{
Log::info(json_encode(new RateLimitedWithRedis('Limiter')));
return [new RateLimitedWithRedis('Limiter')];
}
}
И вот сейчас когда запустить задание, Laravel
всегда должен смотреть в эту минуту сколько заданий уже сделано. Превышен лимит или нет. Тоесть запусить следующее задание или нет.
По сути из провайдера к заданию, перед его выполнением должен идти true / false
. Выполнить или подождать.
Вот что в логе.
И у меня всегда идет true
. И лимит не срабатывает.
Вот сама документация Laravel Job Middleware.
Это config/queue.php
И в .env
QUEUE_CONNECTION=redis
.
Кто столкнулся с такой проблемой? Можете подсказать что делаю не правильно.