Пытаясь использовать python-rq
, чтобы поддержать задний конец нашего веб-приложения, но нажимать новые задания занимает очень много времени - до 12 секунд.
Снижение производительности происходит при выполнении вызова функции enqueue_call
, особенно когда число рабочих процессов, подключенных к системе, увеличивается (более 200).
Система работает следующим образом:
- Передний конец помещает задания на сервер очереди задач. Это использует функцию
enqueue_call
для передачи аргументов в задание (например, тайм-аут и ttl) в дополнение к фактическим аргументам функции, которая должна быть выполнена. - Несколько процессов (разбросанных по нескольким машинам) работают с рабочими, каждый под UNIX
screen
. Рабочие следуют шаблону, представленному в документации, выполняя функциюWorker.work()
бесконечного цикла для прослушивания в очередях. - Во время обработки некоторые из задач порождают новые, обычно в той же очереди, на которой они запущены.
Об инфраструктуре:
- Сервер Redis, который запускает эту очередь задач, посвящен этому. Кроме того, постоянство отключено. Он работает на сервере Rackspace объемом 4 ГБ.
- При запуске
redis-benchmark
на сервере с очередью задач мы получаем в среднем более 20000 р/с для большинства тестов.
Как мы можем улучшить производительность push для новых рабочих мест в такой ситуации? Есть ли лучший образец, который мы должны использовать?