Toepassingen controleren en besturen met supervisor deel 2

In het eerste deel van deze tweedelige instructiereeks hebben we Supervisor opgezet en beheerd om met onze webtoepassingen te werken. In dit deel zullen we zien hoe we supervisorprocessen op afstand programmatisch kunnen besturen via de XML-RPC API.

Ermee beginnen

In het vorige deel zagen we dat Supervisor een web-gebaseerde GUI biedt waarmee we de processen op afstand kunnen beheren met behulp van een paar klikken. Hieronder ziet u een screenshot van deze GUI voor de toepassing die we in het vorige gedeelte hebben gemaakt:

Er begint meteen een vraag in de hersenen te rinkelen. Wat als het mogelijk was om de supervisorprocessen programmatisch te controleren? Dit zou veel mogelijkheden openen waar processen voorwaardelijk kunnen worden gestart of gestopt in plaats van dat ze voor onbepaalde tijd worden uitgevoerd of handmatig worden beheerd door op knoppen te klikken of terminalopdrachten uit te voeren. Dit is heel goed mogelijk met behulp van de XML-RPC API van Supervisor.

De XML-RPC API

De API zelf is redelijk eenvoudig en gebruiksvriendelijk. We zagen dat de HTTP-server voor Supervisor standaard op poort 9001 wordt uitgevoerd. Hetzelfde kan worden gebruikt om verbinding te maken met behulp van een XML-RPC-bibliotheek. In het geval van Python kunnen we gewoon de ingebouwde gebruiken xmlrpclib. Ervan uitgaande dat de Supervisor-server wordt uitgevoerd op http: // localhost: 9001 /:

>>> importeer xmlrpclib >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')

Voer de volgende stappen uit om de huidige status van de Supervisor-server te controleren:

>>> server.supervisor.getState () 'statename': 'RUNNING', 'statecode': 1

De serverdaemon kan opnieuw worden opgestart en gestopt door:

>>> server.supervisor.restart () >>> server.supervisor.shutdown ()

Evenzo kan de lijst met alle beschikbare methoden worden opgehaald door:

>>> server.system.listMethods ()

De API-referentie in de documentatie van de Supervisor is redelijk schoon en spreekt voor zich. In deze zelfstudie ga ik in op een voorbeeld van hoe de processen kunnen worden bestuurd op basis van een voorwaarde en hoe we deze API kunnen uitbreiden om onze eigen methoden te implementeren.

Besturing van processen met behulp van de API

Laten we zeggen dat we een begin willen maken met een nieuw proces om een ​​e-mail te sturen elke keer dat een actie door een gebruiker wordt uitgevoerd. (Er zijn veel manieren om dit te doen, en misschien is dit niet de beste, maar ik gebruik het alleen als een voorbeeld om dit aan te tonen). Laten we zeggen de naam van dit proces zoals gedefinieerd in supervisord.conf is Verzend mail.

if user.action_performed: server.supervisor.startProcess ('send_email')

Op dezelfde manier kunnen we ook automatisch opnieuw opstarten van de activeren supervisord server daemon in het geval dat we een code veranderen in onze applicatie.

if app.code_change (): server.supervisor.restart ()

Deze API kan op vergelijkbare wijze op talloze dergelijke instanties worden toegepast. 

Uitbreiding van de XML-RPC API

We kunnen niet alleen de standaard API-methoden van Supervisor gebruiken, maar ook onze eigen methoden schrijven, waardoor de API wordt uitgebreid met de XML-RPC-interfacefabrieken. Dit kan eenvoudig worden gedaan door een nieuwe toe te voegen [Rpcinterface: x] sectie in supervisord.conf.

[rpcinterface: custom] supervisor.rpcinterface_factory = my_interface: make_custom_rpcinterface

Nu zal ik een kleine aangepaste interface maken voor hetzelfde in een genoemd bestand my_interface.py.

from supervisor.rpcinterface import Supervisor Naamruimte RPCInterface class CustomRPCInterface: def __init __ (self, supervisord): self.supervisord = supervisord self.retries = 3 def startProcessOrRetry (self, name, wait = True): interface = SupervisorNamespaceRPCInterface (self.supervisord) retry = 0 hoewel niet interface.startProcess (naam) of probeer het opnieuw < 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)

Hierboven heb ik een methode gemaakt die, wanneer deze wordt aangeroepen, het proces drie keer zal herhalen in het geval dat het niet start.

Conclusie

In deze tutorialserie leerden we supervisor gebruiken om onze applicaties te controleren en te besturen. We hebben ook gezien hoe we de Web UI en XML-RPC Interface voor hetzelfde kunnen gebruiken. Ten slotte wordt de XML-RPC-interface uitgebreid om de kracht van Supervisor optimaal te benutten.