Класс RateLimited
Класс RateLimited представляет собой middleware для заданий очереди,
который ограничивает количество попыток выполнения задания в определённый
промежуток времени. Он позволяет создавать гибкие ограничения на основе
уникальных ключей, таких как идентификатор пользователя или IP-адрес.
Класс принимает в конструкторе два параметра: уникальный ключ для ограничения
и количество разрешённых попыток.
Синтаксис
<?php
use IlluminateQueueMiddlewareRateLimited;
return new RateLimited($key, $maxAttempts, $decayMinutes = 1);
?>
Пример использования
Давайте создадим задание, которое ограничивает отправку уведомлений пользователю до 3 раз в минуту:
<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueMiddlewareRateLimited;
use IlluminateQueueSerializesModels;
class SendNotification implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function middleware()
{
return [
new RateLimited('user_' . $this->userId, 3, 1)
];
}
public function handle()
{
// Отправка уведомления пользователю
echo "Notification sent to user " . $this->userId;
}
}
?>
Результат выполнения кода:
"Notification sent to user 1"
"Notification sent to user 1"
"Notification sent to user 1"
Пример с динамическим ключом
Используем IP-адрес в качестве ключа для ограничения количества запросов от одного источника:
<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueMiddlewareRateLimited;
use IlluminateQueueSerializesModels;
class ProcessRequest implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $ipAddress;
public function __construct($ipAddress)
{
$this->ipAddress = $ipAddress;
}
public function middleware()
{
return [
new RateLimited('ip_' . $this->ipAddress, 10, 5)
];
}
public function handle()
{
// Обработка запроса
echo "Processing request from IP: " . $this->ipAddress;
}
}
?>
Результат выполнения кода:
"Processing request from IP: 192.168.1.1"
"Processing request from IP: 192.168.1.1"
"Processing request from IP: 192.168.1.1"
"Processing request from IP: 192.168.1.1"
"Processing request from IP: 192.168.1.1"
Пример с комбинированным ключом
Создадим ограничение на основе комбинации пользователя и типа действия:
<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueMiddlewareRateLimited;
use IlluminateQueueSerializesModels;
class ActionJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $userId;
protected $actionType;
public function __construct($userId, $actionType)
{
$this->userId = $userId;
$this->actionType = $actionType;
}
public function middleware()
{
$key = 'user_' . $this->userId . '_' . $this->actionType;
return [
new RateLimited($key, 5, 2)
];
}
public function handle()
{
// Выполнение действия
echo "Action " . $this->actionType . " performed by user " . $this->userId;
}
}
?>
Результат выполнения кода:
"Action export performed by user 1"
"Action export performed by user 1"
"Action export performed by user 1"
"Action export performed by user 1"
"Action export performed by user 1"
Смотрите также
-
класс
tries,
который определяет максимальное количество попыток выполнения задания -
класс
timeout,
который задает максимальное время выполнения задания -
класс
backoff,
который определяет задержку между повторными попытками -
класс
WithoutOverlapping,
который предотвращает одновременное выполнение дублирующихся заданий