Smarty

  1. Главная
  2. Документы
  3. Smarty
  4. Масштабирование и отказоустойчивость
  5. Настройка асинхронного выполнения задач через RQ (Redis Queue)

Настройка асинхронного выполнения задач через RQ (Redis Queue)

Некоторые процессы в Smarty во время синхронного выполнения могут вызывать лавинообразную нагрузку на CPU, тем самым провоцируя аварийные ситуации и долгий отклик системы.

Например, при изменении активного канала через панель администрирования Smarty или Content API все активные аккаунты, которым доступен данный канал, уведомляются о необходимости обновить список каналов через выставление соответствующего флага, который запрашивается автоматически при следующей проверке статуса аккаунта. Данное действие может спровоцировать большую волну нагрузки, а как следствие — зависание и даже полный отказ системы.

Для устранения данного эффекта в Smarty был добавлен новый модуль RQ, позволяющий ставить поступающие на выполнение задачи в очередь и распределять нагрузку, возникающую при их выполнении, по времени.

При включённом механизме RQ выставление флага из описанной выше ситуации будет происходить на очереди задач с низким приоритетом. Это позволит избежать зависания интерфейса панели администрирования, а также регулировать скорость выставления флага для предотвращения повышенной нагрузки на сервер из-за массового обновления каналов клиентами (скорость выставления флага регулируется опцией TVMIDDLEWARE_CHANNEL_LIST_MAX_ACCOUNTS_PER_MINUTE).

Используемые термины:

Воркер — процесс, который постоянно опрашивает очередь на наличие новых задач и если такие находятся, выполняет их. Обычно воркеров несколько и работают они по принципу: кто первый получил доступ к очереди, тот и выполняет задачу.

Планировщик — процесс, который с определенней периодичностью ставит задачи воркеру в очередь. Их также может быть несколько, коллизии между ними решаются с помощью блокировок (ставит задачу тот, который первым завладеет флагом lock).

Включение и конфигурация RQ

Работа данного механизма является опциональной и включается параметром SMARTY_USE_RQ в конфигурационном файле Smarty.

SMARTY_USE_RQ=True

Помимо включенной опции для работы механизма необходим запущенный сервис smarty-rq:

systemctl start smarty-rq@<settings>

где <settings> — это имя файла настроек из /etc/microimpuls/smarty/.

Для добавления сервиса в автозапуск используется команда:

systemctl enable smarty-rq@<settings>

Очередь для работы использует отдельную базу данных в Redis. Для корректной работы механизма необходимо обеспечить доступ к этой БД со всех инстансов Smarty. В RQ_QUEUES обязательно должно быть сконфигурировано три очереди: default, high и low.

Настройки используемой БД находятся в параметре RQ_QUEUES. Пример:

RQ_QUEUES = {
    'default': {
        'HOST': '10.0.1.2',
        'PORT': 6379,
        'DB': 10,
        'DEFAULT_TIMEOUT': 360,
    },
    'high': {
        'HOST': '10.0.1.2',
        'PORT': 6379,
        'DB': 10,
        'DEFAULT_TIMEOUT': 360,
    },
    'low': {
        'HOST': '10.0.1.2',
        'PORT': 6379,
        'DB': 10,
        'DEFAULT_TIMEOUT': 3600,
    },
} 

Просмотр состояния очереди

Команда используется для проверки состояния очереди:

smarty_manage rqstats --settings=settings.<settings> 

Пример вывода команды:

 ------------------------------------------------------------------------------
 | Name           |    Queued |    Active |  Deferred |  Finished |   Workers |
 ------------------------------------------------------------------------------
 | default        |         0 |         0 |         0 |         0 |         1 |
 | high           |         0 |         0 |         0 |         0 |         0 |
 | low            |         0 |         0 |         0 |         3 |         1 |
 ------------------------------------------------------------------------------

Примечание: Значение 0 в столбце Workers говорит о том, что ни один воркер на данной очереди не запущен. Необходимо проверить работу сервиса smarty-rq и конфигурацию RQ_QUEUES.

Логирование работы очереди

Лог-файл RQ находится в файле /var/log/microimpuls/smarty/smarty_rq.log, рядом с остальными файлами логов. Для каждой задачи логируются:

  • имя задачи;
  • её параметры;
  • результат ее выполнения (успех/неуспех).