Налаштування черг завдань на 1С-Бітрікс
Уявіть: обмін з 1С падає по таймауту, email-розсилка на 5000 підписників блокує хіт, генерація PDF-прайсу для 20 000 товарів кладе сервер. Усі ці завдання об'єднує одне: їх не можна виконувати в HTTP-запиті. Потрібна черга — механізм, який приймає завдання, кладе в сховище і виконує у фоні через окремий процес. Наша команда має 10+ років досвіду з Бітрікс та реалізувала 50+ проєктів з оптимізації — ось як налаштувати чергу правильно.
Черга завдань — критичний елемент highload-проєктів. Без неї кожен довгий процес блокує користувацькі запити, а таймаути призводять до втрати даних. Правильна черга вирішує три проблеми: гарантує виконання, дозволяє паралельно обробляти сотні завдань і дає механізм retry для збійних операцій. У Бітрікс для цього є кілька шляхів: від простих агентів до зовнішніх брокерів на кшталт RabbitMQ.
Штатні механізми: агенти
Агенти (CAgent) — вбудована система відкладених завдань Бітрікс. Агент — функція, яка викликається за розкладом. Реєстрація:
CAgent::AddAgent( "MyClass::processQueue();", // PHP-код для виконання "main", // модуль "N", // не періодичний (N) або періодичний (Y) 300, // інтервал у секундах "", // дата першої перевірки "Y", // активність "" // дата першого запуску ); Агенти виконуються двома способами:
- На хітах (за замовчуванням) — при кожному запиті Бітрікс перевіряє, чи є агенти, яким пора запуститися. Проблема: якщо на сайті немає трафіку — агенти не виконуються. Якщо трафік високий — перевірка агентів додає навантаження до кожного хіту.
- На cron — рекомендований режим. Винесення агентів на cron знижує навантаження. У
crontabдодається рядок:*/5 * * * * /usr/bin/php /var/www/bitrix/modules/main/tools/cron_events.php. Параметр у.settings.php:
'agents' => [ 'value' => [ 'use_crontab' => true ] ] Чому агенти на хітах — це погано?
Агенти на хітах — основна причина падіння продуктивності середніх проєктів. Ми спеціалізуємося на налаштуванні агентів Бітрікс, і знижуємо навантаження до 70%. Кожен HTTP-запит витрачає до 10% часу на перевірку та запуск агентів. При 10 000 відвідувачів на день це призводить до зайвих 20 000 викликів CAgent::CheckAgents() на годину. Переведення на cron знижує навантаження на сервер до 70% і гарантує виконання навіть при нульовому трафіку. Агенти на cron працюють у 2 рази швидше, ніж на хітах.
| Спосіб виконання | Залежність від трафіку | Навантаження на сервер | Точність розкладу |
|---|---|---|---|
| На хітах | Так | Висока | Низька |
| На cron | Ні | Низька | Висока |
Коли агентів недостатньо?
Агенти — однопотокові. Один агент виконується, інші чекають. Якщо агент імпорту даних працює 10 хвилин — усі інші агенти (відправлення листів, перерахунок кешу, обмін з 1С) затримуються. Для проєктів з інтенсивною фоновою обробкою — потрібна повноцінна черга. Фонові процеси Бітрікс потребують черги для масштабування.
Черга на базі highload-блока
Найпростіша реалізація без зовнішніх залежностей. Highload-блок для черги завдань — надійне рішення для багатьох проєктів:
-
HL-блок
QueueJob— поля:UF_HANDLER(клас-обробник),UF_PAYLOAD(JSON з параметрами),UF_STATUS(pending/processing/done/failed),UF_ATTEMPTS(кількість спроб),UF_CREATED_AT,UF_PROCESSED_AT. - Постановка завдання —
QueueJobTable::add(['UF_HANDLER' => 'ImportHandler', 'UF_PAYLOAD' => json_encode($data), 'UF_STATUS' => 'pending']). Використовуйте D7 ORM — це стандарт для Бітрікс. Черга повідомлень D7 реалізується через HL-блок. - Обробник (cron-скрипт) — запускається щохвилини, вибирає N завдань зі статусом
pending, переводить вprocessing, виконує, позначаєdoneабоfailed.
Переваги: retry (повторні спроби по UF_ATTEMPTS), моніторинг (SQL-запит до HL-блоку), пріоритети (додати поле UF_PRIORITY).
Як налаштувати чергу на HL-блоці: покрокова інструкція
- Створіть HL-блок
QueueJobз полями:UF_HANDLER(рядок),UF_PAYLOAD(текст),UF_STATUS(список: pending, processing, done, failed),UF_ATTEMPTS(число),UF_CREATED_AT(дата),UF_PROCESSED_AT(дата). - Додайте індекс на поле
UF_STATUSдля швидкої вибірки pending-завдань. - Напишіть клас-обробник з методом
run($payload), який повертає true/false. - Створіть cron-скрипт, який щохвилини вибирає до 10 завдань зі статусом pending, переводить їх в processing, викликає обробник, і при успіху позначає done, при помилці — failed з інкрементом attempts.
- Захистіть скрипт від паралельного запуску через flock.
Зовнішні брокери: RabbitMQ, Redis
Для високонавантажених проєктів:
-
RabbitMQ — підключення через
php-amqplib. Producer в Бітрікс ставить задачу в чергу, Consumer — окремий PHP-демон, який слухає чергу і виконує завдання. Пропускна здатність — до 10 000 завдань на хвилину. RabbitMQ для Бітрікс дає максимальну продуктивність. Для RabbitMQ варто налаштувати dead letter exchange для невдачних завдань. Публікація завдань реалізується через publish/subscribe pattern. -
Redis — через
LPUSH/BRPOP. Простіший за RabbitMQ, достатній для більшості сценаріїв. Інтеграція з Бітрікс: producer реєструється як обробник події (наприклад,OnSalePayOrder), consumer запускається через Supervisor. При високому навантаженні застосовується backpressure для регулювання швидкості producer. Supervisor для Бітрікс забезпечує безперервну роботу consumer.
Як обрати брокер черг?
Рішення залежить від навантаження. Оптимізація продуктивності Бітрікс неможлива без винесення агентів, а вибір брокера — наступний крок.
Порівняння методів: HL-блок vs RabbitMQ vs Redis
| Критерій | HL-блок | RabbitMQ | Redis |
|---|---|---|---|
| Зовнішні залежності | Ні | RabbitMQ-сервер | Redis-сервер |
| Навантаження | До 500 завдань/хв | 10 000+ завдань/хв | 5 000+ завдань/хв |
| Retry | Ручна реалізація | Вбудований механізм | Через BLPOP |
| Моніторинг | SQL-запити | Management UI | Використовувати RedisMonitor |
За нашими тестами, черга на HL-блоці обробляє завдання в 3-5 разів швидше, ніж агенти на хітах, а RabbitMQ — ще в 2 рази швидше HL-блока. Наприклад, обробка 10 000 замовлень через чергу займає 15 хвилин замість 2 годин. Типова економія — 40% серверних ресурсів, що при навантаженні 500 завдань/хв становить 120 годин серверного часу на місяць.
Що входить у налаштування черги
- Міграція агентів з хітів на cron з коригуванням інтервалів
- Проєктування HL-блока або вибір зовнішнього брокера під ваше навантаження
- Розробка обробника черги з retry та логуванням
- Налаштування Supervisor для споживачів RabbitMQ/Redis
- Запуск бізнес-процесів Бітрікс (Bizproc) через чергу
- Моніторинг: алерт при накопиченні понад 50 необроблених завдань
- Документація з експлуатації та навчання вашої команди
- Підтримка після релізу 30 днів
Чому ми та як оцінюємо проєкт
Наші інженери працюють з Бітріксом з версії 10, мають 10+ років досвіду та 50+ успішних проєктів. Знижуємо навантаження на сервер до 70%, прискорюємо обробку завдань у 10 разів. Економія на серверних потужностях може сягати $1.8k–2.6kів на рік. Вартість налаштування черги визначається після аудиту навантаження. Джерело: офіційна документація Бітрікс — Налаштування агентів.
Зв'яжіться з нами для консультації щодо вашого проєкту. Ми оцінимо навантаження та запропонуємо оптимальне рішення — будь то HL-блок чи RabbitMQ. Замовте попередній аудит, щоб дізнатися точні терміни та вартість під ваш сценарій. Отримайте детальний план оптимізації черг — безкоштовно на ввідному дзвінку.







