Примечание: недоступно для Redis Cluster.
Некоторые процессы в Smarty во время синхронного выполнения могут вызывать лавинообразную нагрузку на CPU, тем самым провоцируя аварийные ситуации и долгий отклик системы.
Например, при изменении активного канала через панель администрирования Smarty или Content API все активные аккаунты, которым доступен данный канал, уведомляются о необходимости обновить список каналов через выставление соответствующего флага, который запрашивается автоматически при следующей проверке статуса аккаунта. Данное действие может спровоцировать большую волну нагрузки, а как следствие — зависание и даже полный отказ системы.
Для устранения данного эффекта в Smarty был добавлен новый модуль RQ, позволяющий ставить поступающие на выполнение задачи в очередь и распределять нагрузку, возникающую при их выполнении, по времени.
При включённом механизме RQ выставление флага из описанной выше ситуации будет происходить на очереди задач с низким приоритетом. Это позволит избежать зависания интерфейса панели администрирования, а также регулировать скорость выставления флага для предотвращения повышенной нагрузки на сервер из-за массового обновления каналов клиентами (скорость выставления флага регулируется опцией TVMIDDLEWARE_CHANNEL_LIST_MAX_ACCOUNTS_PER_MINUTE
, а максимальное время работы RQ во время этого процесса — RQ_CHANNEL_LIST_CHANGED_JOB_TIMEOUT).
Используемые термины:
Воркер — процесс, который постоянно опрашивает очередь на наличие новых задач и если такие находятся, выполняет их. Обычно воркеров несколько и работают они по принципу: кто первый получил доступ к очереди, тот и выполняет задачу.
Планировщик — процесс, который с определенней периодичностью ставит задачи воркеру в очередь. Их также может быть несколько, коллизии между ними решаются с помощью блокировок (ставит задачу тот, который первым завладеет флагом 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
, рядом с остальными файлами логов. Для каждой задачи логируются:
- имя задачи;
- её параметры;
- результат ее выполнения (успех/неуспех).