Laravel Balanced Queue, створений YanGusik, керує розподілом черги між групами користувачів з контролем одночасного виконання на користувача та кількома стратегіями партиціювання, щоб уникнути монополізації черги.
Як це працює
Стандартні Laravel-черги обробляють завдання за принципом FIFO. Якщо User A надсилає 10 000 завдань, а User B — 5, то User B чекатиме, поки не завершаться всі завдання User A. Laravel Balanced Queue ділить чергу на партиції — зазвичай по одній на користувача або tenant — і по черзі обходить їх, даючи кожному справедливий доступ до воркерів.
Початок роботи
Додайте трейд BalancedDispatchable до ваших класів завдань:
use Illuminate\Contracts\Queue\ShouldQueue;
use YanGusik\BalancedQueue\Jobs\BalancedDispatchable;
class GenerateAIImage implements ShouldQueue
{
use BalancedDispatchable;
public function __construct(
public int $userId,
public string $prompt
) {}
public function handle(): void
{
// AI generation logic
}
}
Відправляйте завдання через з'єднання balanced:
GenerateAIImage::dispatch($userId, $prompt)->onConnection('balanced');
Пакет автоматично визначає ключі партиції за властивостями на кшталт $userId, $user_id або $tenantId, групуючи завдання кожного користувача в окрему партицію.
Стратегії партиціювання
У config/balanced-queue.php є три стратегії ротації: round-robin (за замовчуванням) циклічно проходить партиції в жорсткому порядку для рівномірного розподілу, random обирає партицію ймовірнісно для високопродуктивних сценаріїв, а smart віддає перевагу меншим чергам, щоб уникнути голодування при різних обсягах завдань між користувачами.
Обмеження паралелізму
Пакет дозволяє задати max_concurrent у config/balanced-queue.php, щоб обмежити, скільки завдань із однієї партиції можуть виконуватися одночасно:
'limiters' => [
'simple' => [
'max_concurrent' => 2,
],
],
Це запобігає витісненню інших користувачів з усіх воркерів і допомагає керувати лімітами API, коли завдання роблять зовнішні запити.
Моніторинг
Слідкуйте за станом партицій командою php artisan balanced-queue:table --watch для оновлень у реальному часі — вона показує очікувані завдання та активних воркерів по партиціях. Пакет також містить команди для очищення черг та програмний API метрик для власних дашбордів.
Інтеграція з Horizon
Пакет працює з Laravel Horizon. Налаштуйте supervisor у config/horizon.php, використовуючи з'єднання balanced, і застосовуйте php artisan balanced-queue:table для точних метрик, оскільки лічильники pending у Horizon не відображають структуру розбитих партицій.
Детальніше
Щоб дізнатися більше про Laravel Balanced Queue і переглянути код, відвідайте GitHub repository. Пакет вимагає PHP 8.0+ та Laravel 9.0+, з Redis як драйвером черги.