I den första delen av den här tvådelade handledningsserien såg vi upp och kontrollerar Supervisor för att arbeta med våra webbapplikationer. I den här delen kommer vi att se hur vi programmässigt kan styra tillsynsprocesser på distans via XML-RPC API.
I den föregående delen såg vi att handledaren tillhandahåller en webbaserad GUI som tillåter oss att fjärrstyra processerna med hjälp av några få klick. Nedan visas en skärmdump av denna GUI för den applikation som vi skapade i föregående del:
En fråga börjar omedelbart ringa i hjärnan. Vad händer om det var möjligt att styra övervakningsprocesserna programmatiskt? Detta skulle öppna många möjligheter där processer kan startas eller stoppas villkorligt snarare än att de körs obestämt eller kontrollerar dem manuellt genom att klicka på knappar eller köra terminalkommandon. Detta är mycket möjligt med hjälp av XML-RPC API som tillhandahålls av Supervisor.
API själv är ganska enkelt och lätt att använda. Vi såg att HTTP-servern för Supervisor kör som standard på port 9001. Detsamma kan användas för att ansluta med något XML-RPC-bibliotek. När det gäller Python kan vi helt enkelt använda den inbyggda xmlrpclib
. Antag att Supervisor-servern körs på http: // localhost: 9001 /:
>>> importera xmlrpclib >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')
För att kontrollera Supervisorserverens nuvarande tillstånd, kör:
>>> server.supervisor.getState () 'statename': 'RUNNING', 'statecode': 1
Serverns demonen kan startas om och stoppas av:
>>> server.supervisor.restart () >>> server.supervisor.shutdown ()
På samma sätt kan listan över alla tillgängliga metoder hämtas av:
>>> server.system.listMethods ()
API-referensen som tillhandahålls i handledarens dokumentation är ganska ren och självförklarande. Att gå vidare i denna handledning kommer jag att täcka ett exempel på hur man kontrollerar processerna baserat på ett villkor, och även hur vi kan förlänga detta API för att implementera våra egna metoder.
Låt oss säga att vi vill starta en ny process för att skicka ett mail varje gång en åtgärd utförs av någon användare. (Det finns många sätt att göra detta, och kanske är det inte det bästa, men jag använder bara det som ett exempel för att visa det). Låt oss säga namnet på den här processen enligt definitionen i supervisord.conf
är skicka brev
.
om user.action_performed: server.supervisor.startProcess ('send_email')
På samma sätt kan vi också utlösa automatisk omstart av supervisord
server daemon om vi har en kodändring i vår ansökan.
om app.code_change (): server.supervisor.restart ()
Detta API kan på samma sätt tillämpas på otaliga sådana fall.
Vi kan inte bara använda standard API-metoder som tillhandahålls av tillsynsmyndigheten utan också skriva egna metoder och utvidga API: n genom att använda XML-RPC-gränssnittsfabrikerna. Detta kan helt enkelt göras genom att lägga till en ny [Rpcinterface: x]
avsnitt i supervisord.conf
.
[rpcinterface: custom] supervisor.rpcinterface_factory = my_interface: make_custom_rpcinterface
Nu ska jag skapa ett litet anpassat gränssnitt för samma i en fil med namnet my_interface.py
.
från supervisor.rpcinterface import SupervisorNamespaceRPCInterface class CustomRPCInterface: def __init __ (self, supervisord): self.supervisord = supervisord self.retries = 3 def startProcessOrRetry (själv, namn, vänta = sant): interface = SupervisorNamespaceRPCInterface (self.supervisord) retry = 0 medan inte interface.startProcess (namn) eller försök igen < 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)
Ovan har jag skapat en metod som vid uppmaning kommer att försöka processen tre gånger om det inte går att starta.
I denna handledningsserie lärde vi oss hur vi använder Supervisor för att övervaka och styra våra applikationer. Vi såg också hur vi kan använda webbgränssnittet och XML-RPC-gränssnittet för detsamma. Slutligen utökas XML-RPC-gränssnittet för att utnyttja tillsynsmyndighetens förmåga till vår fördel.