Справедливий розподіл черг за допомогою Laravel Balanced Queue

3
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 01 лютого, 2026
Laravel Balanced Queue вирішує проблему монополізації черг — розподіляє завдання по партиціях і обмежує одночасне виконання для кожного користувача. Дізнайтеся, як додати трейд BalancedDispatchable, обрати стратегію ротації та відстежувати стан партицій, щоб гарантувати справедливий доступ до воркерів.

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 як драйвером черги.

Популярні

Logomark Logotype

Оптимізація запитів до бази даних за допомогою скорочених методів Laravel

Laravel пропонує зручні методи для роботи з датами, які значно спрощують запити до бази даних. Досліджуйте, як ці інтуїтивно зрозумілі функції допомагають створювати чіткі та зрозумілі умови для роботи з часовими даними!

Logomark Logotype

Laravel Boost — ваш стартовий набір для програмування з використанням штучного інтелекту

Вперше у світі Laravel з'являється можливість, яка значно спростить ваше повсякденне програмування завдяки новому пакету Laravel Boost. Читайте статтю, щоб дізнатися, як посилена інтеграція штучного інтелекту може підвищити ефективність вашої роботи та оптимізувати створення проектів у Laravel

Logomark Logotype

Як задокументувати кілька API в Laravel за допомогою Scramble

Ви знали, що в одному додатку Laravel можна реалізувати кілька API? У нашій статті ви дізнаєтеся, як за допомогою Scramble легко документувати різні версії API та налаштувати доступ до документації, щоб зробити її публічною або приватною. Читайте далі, щоб дізнатися більше