2015-12-31 2 views
2

Я использую supervisord какое-то время - выдающийся инструмент. Единственным вариантом использования, который я не смог выяснить, является то, как настраивать задания для перезапуска до тех пор, пока не будет выполнено условие, а затем прекратите перезапуск.Условный перезапуск процессов супервизора?

Пример: предположим, что у вас есть куча работы, например, масштабирование тысяч изображений или обслуживание миллионов запросов в очереди. Полезной моделью было бы запустить много рабочих параллельно с работой над этим отставанием. Вы могли бы создать надзорную работу, которая обеспечит 100 рабочих, и если кто-то из них потерпит крах, супервизор будет разворачивать замену, чтобы пул работников не сокращался.

Это здорово, пока работа не будет завершена. Возможно, когда отставание исчезнет, ​​количество работников должно уменьшиться до 1 или 0. Супервизор будет продолжать увеличивать общее число до 100 процессов, даже если каждый новый процесс проверяет, есть ли работа, которая будет выполнена, не видит никого и закрывается очень быстро.

Есть ли способ для экземпляра процесса или семейства процессов связаться с supervisord, чтобы сказать, что поведение autoretsart больше не требуется? Еще лучше, есть ли способ масштабировать количество рабочих процессов вверх и вниз на основе некоторого условия (например, количество файлов в каталоге или?).

Я знаю, что это можно сделать, обновив файл supervisord.conf и запустив supervisorctl reload, но я бы предпочел что-то более декларативное и самоуправляемое, если такая вещь существует.

ответ

1

Есть ли способ для экземпляра процесса или семейства процессов связаться с supervisord, чтобы сказать, что поведение autoretsart больше не требуется?

Вы можете свернуть деятельность, убедившись, что выход ваших процессов с различным ExitCode (ами), когда нет работы и сделать те ожидаемый exitcodes с autorestart=unexpected в конфигурации.

Еще лучше, есть ли способ масштабировать число рабочих процессов вверх и вниз на основе некоторого условия (например, количество файлов в каталоге или?).

Проблема заключается в том, что автоматическая state transitions не позволяет получать процессы, запущенные снова от ожидаемого EXITED состояния. AFAIK единственный способ сделать это с помощью API-интерфейса XML-RPC startProcess, поэтому вам нужно будет написать или найти соответствующий прослушиватель событий, который следит за вашим начальным условием, а затем использует API.

Альтернативный дизайн заключается в том, чтобы обернуть рабочий процесс в обработчик событий, наблюдая за PROCESS COMMUNICATION Events и иметь один нормальный подпроцесс, сообщающий новые задачи в пул слушателей событий. Но эта модель в настоящее время не устраняет пул ожидающих процессов, когда нет работы, она просто организует задачу управления таким образом, чтобы упростить выделение логики и использования ресурсов, связанных с задачами.