Nella prima parte di questa serie di tutorial in due parti, abbiamo visto configurare e controllare Supervisor per lavorare con le nostre applicazioni web. In questa parte vedremo come possiamo controllare a livello di codice i processi di Supervisor da remoto tramite l'API XML-RPC.
Nella parte precedente, abbiamo visto che Supervisor fornisce una GUI basata sul Web che ci consente di controllare a distanza i processi con l'aiuto di pochi clic. Di seguito è riportato uno screenshot di questa GUI per l'applicazione che abbiamo creato nella parte precedente:
Una domanda inizia immediatamente a squillare nel cervello. Cosa accadrebbe se fosse possibile controllare i processi del Supervisore a livello di programmazione? Ciò aprirebbe molte possibilità in cui i processi possono essere avviati o arrestati in modo condizionale piuttosto che farli funzionare indefinitamente o controllarli manualmente facendo clic sui pulsanti o eseguendo i comandi del terminale. Questo è molto possibile utilizzando l'API XML-RPC fornita da Supervisor.
L'API stessa è piuttosto semplice e facile da usare. Abbiamo visto che il server HTTP per Supervisor viene eseguito sulla porta 9001 per impostazione predefinita. Lo stesso può essere usato per connettersi usando qualsiasi libreria XML-RPC. Nel caso di Python, possiamo semplicemente usare il built-in xmlrpclib
. Supponendo che il server Supervisor funzioni su http: // localhost: 9001 /:
>>> import xmlrpclib >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')
Per verificare lo stato corrente del server Supervisor, eseguire:
>>> server.supervisor.getState () 'statename': 'RUNNING', 'statecode': 1
Il daemon del server può essere riavviato e fermato da:
>>> server.supervisor.restart () >>> server.supervisor.shutdown ()
Allo stesso modo, l'elenco di tutti i metodi disponibili può essere recuperato da:
>>> server.system.listMethods ()
Il riferimento API fornito nella documentazione del Supervisore è abbastanza pulito e autoesplicativo. Andando avanti in questo tutorial, tratterò un esempio di come controllare i processi in base a una condizione, e anche come possiamo estendere questa API per implementare i nostri metodi.
Diciamo che vogliamo avviare una nuova procedura per inviare un'e-mail ogni volta che un'azione viene eseguita da qualche utente. (Ci sono molti modi per farlo, e forse questo non è il migliore, ma lo sto solo usando come esempio per dimostrarlo). Diciamo il nome di questo processo come definito in supervisord.conf
è inviare una mail
.
if user.action_performed: server.supervisor.startProcess ('send_email')
Allo stesso modo, possiamo anche attivare il riavvio automatico del supervisord
server daemon nel caso in cui si verifichi un cambio di codice nella nostra applicazione.
se app.code_change (): server.supervisor.restart ()
Questa API può essere applicata similmente a innumerevoli istanze di questo tipo.
Non possiamo solo utilizzare i metodi API standard forniti da Supervisor, ma anche scrivere i nostri metodi, estendendo l'API utilizzando le fabbriche dell'interfaccia XML-RPC. Questo può essere fatto semplicemente aggiungendo un nuovo [Rpcinterface: x]
sezione in supervisord.conf
.
[rpcinterface: custom] supervisor.rpcinterface_factory = my_interface: make_custom_rpcinterface
Ora creerò una piccola interfaccia personalizzata per lo stesso in un file chiamato my_interface.py
.
da 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 mentre non è interfaccia.startProcess (nome) o riprova < 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)
Sopra, ho creato un metodo che, una volta chiamato, riproverà il processo tre volte in caso di mancato avvio.
In questa serie di tutorial, abbiamo imparato come utilizzare Supervisor per monitorare e controllare le nostre applicazioni. Abbiamo anche visto come possiamo utilizzare l'interfaccia utente Web e l'interfaccia XML-RPC per lo stesso. Infine, l'interfaccia XML-RPC viene estesa per sfruttare il potere del Supervisore a nostro vantaggio.