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