Мониторинг и управление приложениями с использованием Supervisor: часть 2
() translation by (you can also view the original English article)
В первой части этой серии из двух частей мы увидели, как настроить и контролировать Supervisor для работы с нашими веб-приложениями. В этой части мы увидим, как мы можем программно управлять процессами Supervisor удаленно через API XML-RPC.
Начинаем
В предыдущей части мы увидели, что Supervisor предоставляет веб-интерфейс, который позволяет удаленно управлять процессами с помощью нескольких кликов. Ниже приведен снимок экрана этого графического интерфейса для приложения, которое мы создали в предыдущей части:



В мозгу сразу начинает звенеть вопрос. Что делать, если можно было бы контролировать процессы Supervisor программно? Это откроет много возможностей, когда процессы могут быть запущены или остановлены условно, вместо того чтобы запускать их неограниченно или управлять ими вручную, нажимая кнопки или запуская команды терминала. Это очень возможно с использованием API XML-RPC, предоставляемого Supervisor.
API XML-RPC
Сам API довольно прост и легок в использовании. Мы видели, что HTTP-сервер для Supervisor работает по умолчанию на порту 9001. То же самое можно использовать для подключения с использованием любой библиотеки XML-RPC. В случае Python мы можем просто использовать встроенный xmlrpclib
. Предполагая, что сервер Supervisor работает на http://localhost:9001/:
1 |
>>> import xmlrpclib |
2 |
>>> server = xmlrpclib.Server('http://localhost:9001/RPC2') |
Чтобы проверить текущее состояние сервера Supervisor, запустите:
1 |
>>> server.supervisor.getState() |
2 |
{'statename': 'RUNNING', 'statecode': 1} |
Демон сервера можно перезапустить и остановить:
1 |
>>> server.supervisor.restart() |
2 |
>>> server.supervisor.shutdown() |
Аналогичным образом можно получить список всех доступных методов:
1 |
>>> server.system.listMethods() |
Ссылка API, содержащаяся в документации Supervisor, довольно проста и понятна. В этом уроке я расскажу о том, как управлять процессами на основе условия, а также о том, как мы можем расширить этот API для реализации наших собственных методов.
Управление процессами с использованием API
Допустим, мы хотим начать новый процесс отправки электронной почты каждый раз, когда какое-либо действие будет выполнено каким-то пользователем. (Существует много способов сделать это, и, возможно, это не самый лучший, но я просто использую его в качестве примера, чтобы продемонстрировать работу). Скажем, имя этого процесса определено в supervisord.conf
- send_mail
.
1 |
if user.action_performed: |
2 |
server.supervisor.startProcess('send_email') |
Аналогичным образом, мы также можем инициировать автоматический перезапуск демона сервера supervisord
, если у нас есть изменения кода в нашем приложении.
1 |
if app.code_change(): |
2 |
server.supervisor.restart() |
Этот API аналогичным образом можно применять к бесчисленным подобным экземплярам.
Расширение API XML-RPC
Мы можем как использовать стандартные методы API, предоставляемые Supervisor, так и написать наши собственные методы, расширяя API с помощью интерфейсов интерфейса XML-RPC. Это можно сделать, добавив новый раздел [rpcinterface:x]
в файле supervisord.conf
.
1 |
[rpcinterface:custom] |
2 |
supervisor.rpcinterface_factory = my_interface:make_custom_rpcinterface |
Теперь я создам небольшой интерфейс для него в файле с именем my_interface.py
.
1 |
from supervisor.rpcinterface import SupervisorNamespaceRPCInterface |
2 |
|
3 |
|
4 |
class CustomRPCInterface: |
5 |
def __init__(self, supervisord): |
6 |
self.supervisord = supervisord |
7 |
self.retries = 3 |
8 |
|
9 |
def startProcessOrRetry(self, name, wait=True): |
10 |
interface = SupervisorNamespaceRPCInterface(self.supervisord) |
11 |
retry = 0 |
12 |
|
13 |
while not interface.startProcess(name) or retry < self.retries: |
14 |
retry = retry + 1 |
15 |
|
16 |
|
17 |
# this is not used in code but referenced via an entry point in the conf file
|
18 |
def make_custom_rpcinterface(supervisord): |
19 |
return CustomRPCInterface(supervisord) |
Выше я создал метод, который при вызове будет трижды повторять процесс в случае неудачи запуска.
Заключение
В этой серии мы узнали, как использовать Supervisor для мониторинга и управления нашими приложениями. Мы также увидели, как мы можем использовать для веб-интерфейс и XML-RPC. Наконец, интерфейс XML-RPC расширяем, и вы можете использовать все возможности Supervisor для ваших собственных целей.