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