I den første delen av denne todelte opplæringsserien så vi å sette opp og kontrollere Supervisor for å jobbe med våre webprogrammer. I denne delen vil vi se hvordan vi kan styre Supervisor-prosesser eksternt via programmet XML-RPC.
I den forrige delen så vi at veileder gir en nettbasert GUI som tillater oss å styre prosessene eksternt ved hjelp av noen få klikk. Nedenfor er et skjermbilde av denne GUI for programmet vi opprettet i forrige del:
Et spørsmål begynner umiddelbart å ringe i hjernen. Hva om det var mulig å kontrollere veilederprosessene programmatisk? Dette vil åpne opp mange muligheter der prosesser kan startes eller stoppes betinget i stedet for at de kjører på ubestemt tid eller kontrollerer dem manuelt ved å klikke på knapper eller kjører terminalkommandoer. Dette er veldig mulig ved hjelp av XML-RPC API gitt av Supervisor.
API-en selv er ganske enkel og enkel å bruke. Vi så at HTTP-serveren for Supervisor kjører på port 9001 som standard. Det samme kan brukes til å koble til ved hjelp av et XML-RPC-bibliotek. I tilfelle av Python kan vi bare bruke den innebygde xmlrpclib
. Forutsatt at Supervisor-serveren kjører på http: // localhost: 9001 /:
>>> import xmlrpclib >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')
For å sjekke den nåværende tilstanden til Supervisor-serveren, kjør:
>>> server.supervisor.getState () 'statename': 'RUNNING', 'statecode': 1
Serverdemonen kan startes på nytt og stoppes av:
>>> server.supervisor.restart () >>> server.supervisor.shutdown ()
På samme måte kan listen over alle tilgjengelige metoder hentes av:
>>> server.system.listMethods ()
API-referansen som er gitt i veilederens dokumentasjon, er ganske ren og selvforklarende. Går videre i denne opplæringen, vil jeg dekke et eksempel på hvordan man styrer prosessene basert på en tilstand, og også hvordan vi kan utvide denne API for å implementere egne metoder.
La oss si at vi vil starte en ny prosess for å sende en e-post hver gang en handling utføres av noen bruker. (Det er mange måter å gjøre dette på, og kanskje dette er ikke det beste, men jeg bruker det bare som et eksempel for å demonstrere dette). La oss si navnet på denne prosessen som definert i supervisord.conf
er send_mail
.
hvis user.action_performed: server.supervisor.startProcess ('send_email')
På samme måte kan vi også utløse automatisk omstart av supervisord
server daemon hvis vi har en kodeendring i vår søknad.
hvis app.code_change (): server.supervisor.restart ()
Denne API kan også brukes på utallige slike tilfeller.
Vi kan ikke bare bruke standard API-metodene som leveres av veileder, men også skrive våre egne metoder, og utvide API-en ved hjelp av XML-RPC-grensesnittfabrikkene. Dette kan enkelt gjøres ved å legge til en ny [Rpcinterface: x]
delen i supervisord.conf
.
[rpcinterface: tilpasset] supervisor.rpcinterface_factory = my_interface: make_custom_rpcinterface
Nå skal jeg lage et lite tilpasset grensesnitt for det samme i en fil som heter my_interface.py
.
fra supervisor.rpcinterface import SupervisorNamespaceRPCInterface class CustomRPCInterface: def __init __ (selvtillit, veiledning): self.supervisord = supervisord self.retries = 3 def startProcessOrRetry (selv, navn, vent = True): interface = SupervisorNamespaceRPCInterface (self.supervisord) retry = 0 mens ikke interface.startProcess (navn) eller prøv igjen < 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)
Ovenfor har jeg opprettet en metode som, når den blir ringet, vil prøveprosessen tre ganger i tilfelle det ikke starter.
I denne opplæringsserien lærte vi å bruke veileder til å overvåke og kontrollere våre applikasjoner. Vi så også hvordan vi kan bruke webgrensesnittet og XML-RPC-grensesnittet for det samme. Endelig er XML-RPC-grensesnittet utvidet for å utnytte styrkenes styrke til vår fordel.