Im ersten Teil dieser zweiteiligen Tutorialserie haben wir Supervisor für die Arbeit mit unseren Webanwendungen eingerichtet und kontrolliert. In diesem Teil werden wir sehen, wie wir Supervisor-Prozesse über die XML-RPC-API ferngesteuert steuern können.
Im vorigen Teil haben wir gesehen, dass Supervisor eine webbasierte Benutzeroberfläche bietet, mit der wir die Prozesse mit wenigen Klicks fernsteuern können. Unten sehen Sie einen Screenshot dieser GUI für die Anwendung, die wir im vorherigen Teil erstellt haben:
Eine Frage beginnt sofort im Gehirn zu klingeln. Was wäre, wenn die Supervisor-Prozesse programmgesteuert gesteuert werden könnten? Dies würde viele Möglichkeiten eröffnen, bei denen Prozesse bedingt gestartet oder gestoppt werden können, anstatt sie unbegrenzt laufen zu lassen oder manuell durch Klicken auf Schaltflächen oder Ausführen von Terminalbefehlen zu steuern. Dies ist mit der von Supervisor bereitgestellten XML-RPC-API sehr gut möglich.
Die API selbst ist ziemlich unkompliziert und einfach zu bedienen. Wir haben gesehen, dass der HTTP-Server für Supervisor standardmäßig auf Port 9001 ausgeführt wird. Das gleiche kann verwendet werden, um eine Verbindung mit einer beliebigen XML-RPC-Bibliothek herzustellen. Im Falle von Python können wir einfach das eingebaute verwenden xmlrpclib
. Angenommen, der Supervisor-Server läuft unter http: // localhost: 9001 /:
>>> xmlrpclib importieren >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')
Führen Sie zum Überprüfen des aktuellen Status des Supervisor-Servers Folgendes aus:
>>> server.supervisor.getState () 'statename': 'RUNNING', 'statecode': 1
Der Server-Daemon kann neu gestartet und gestoppt werden durch:
>>> server.supervisor.restart () >>> server.supervisor.shutdown ()
Ebenso kann die Liste aller verfügbaren Methoden abgerufen werden durch:
>>> server.system.listMethods ()
Die in der Supervisor-Dokumentation enthaltene API-Referenz ist recht sauber und selbsterklärend. In diesem Tutorial gehe ich auf ein Beispiel ein, wie die Prozesse basierend auf einer Bedingung gesteuert werden können und wie wir diese API erweitern können, um unsere eigenen Methoden zu implementieren.
Nehmen wir an, wir möchten einen neuen Prozess starten, um jedes Mal eine E-Mail zu senden, wenn ein Benutzer eine Aktion ausführt. (Es gibt viele Möglichkeiten, dies zu tun, und vielleicht ist dies nicht die beste, aber ich benutze es nur als Beispiel, um dies zu demonstrieren). Sagen wir den Namen dieses Prozesses wie in definiert supervisord.conf
ist send_mail
.
Wenn user.action_performed: server.supervisor.startProcess ('send_email')
Ebenso können wir einen automatischen Neustart des starten Supervisor
Server-Daemon für den Fall, dass in unserer Anwendung eine Codeänderung vorliegt.
wenn app.code_change (): server.supervisor.restart ()
Diese API kann in ähnlicher Weise auf unzählige solcher Instanzen angewendet werden.
Wir können nicht nur die von Supervisor bereitgestellten Standard-API-Methoden verwenden, sondern auch unsere eigenen Methoden schreiben und die API durch Verwendung der XML-RPC-Schnittstellenfactories erweitern. Dies kann einfach durch Hinzufügen eines neuen erfolgen [rpcinterface: x]
Abschnitt in supervisord.conf
.
[rpcinterface: custom] supervisor.rpcinterface_factory = mein_interface: make_custom_rpcinterface
Jetzt werde ich eine kleine Benutzeroberfläche für dasselbe in einer Datei namens erstellen my_interface.py
.
von supervisor.rpcinterface import SupervisorNamespaceRPCInterface-Klasse CustomRPCInterface: def __init __ (self, supervisord): self.supervisord = supervisord Dabei nicht interface.startProcess (Name) oder erneut versuchen < 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)
Oben habe ich eine Methode erstellt, die beim Aufruf den Prozess dreimal wiederholt, falls der Start fehlschlägt.
In dieser Lernreihe haben wir gelernt, wie Supervisor zur Überwachung und Steuerung unserer Anwendungen verwendet wird. Wir haben auch gesehen, wie wir die Web-Benutzeroberfläche und die XML-RPC-Schnittstelle für dieselbe verwenden können. Schließlich wird die XML-RPC-Schnittstelle erweitert, um die Möglichkeiten von Supervisor zu unserem Vorteil zu nutzen.