Ich bin damit beschäftigt, eine Python-Anwendung mit ZeroMQ zu schreiben und eine Variation des Majordomo-Musters zu implementieren, wie im ZGuide beschrieben .
Ich habe einen Makler als Vermittler zwischen einer Reihe von Arbeitern und Kunden. Ich möchte für jede eingehende Anfrage eine umfangreiche Protokollierung durchführen, aber ich möchte nicht, dass der Broker Zeit damit verschwendet. Der Broker sollte diese Protokollierungsanforderung an etwas anderes übergeben.
Ich habe mir zwei Möglichkeiten ausgedacht:
- Erstellen Sie Worker, die nur für die Protokollierung vorgesehen sind, und verwenden Sie den ZeroMQ IPC-Transport
- Verwenden Sie Multiprocessing mit einer Warteschlange
Ich bin mir nicht sicher, welches besser oder schneller ist. Mit der ersten Option kann ich die aktuellen Worker-Basisklassen verwenden, die ich bereits für normale Worker verwende. Die zweite Option scheint jedoch schneller zu implementieren zu sein.
Ich hätte gerne Ratschläge oder Kommentare zu den oben genannten oder möglicherweise eine andere Lösung.
quelle
Möglicherweise möchten Sie eine dritte Möglichkeit für die Implementierung der Remote-Protokollierung in Betracht ziehen. Wenn Sie das Standard-Python-Protokollierungsmodul verwenden, können Sie die
logging.QueueHandler
Klasse in Ihren Workern, Clients und Brokern sowie dielogging.QueueListener
Klasse in Ihrem Remote-Protokollierungsprozess verwenden.Anstatt das normale Python
multiprocessing.Queue
als Transportmittel zwischen Ihren Anwendungsprozessen und Ihrem Protokollierungsprozess zu verwenden, implementieren Sie Ihre eigeneQueue
Ersatzklasse mithilfe von ZeroMQ mit Ententypisierung, damit Ihre Klasse ein Ersatz für das Standard-Python istQueue
. Auf diese Weise kann Ihre Anwendung in jeder Umgebung unverändert von einem einzelnen Multi-Core-Computer über verteilte Rechenzentren ausgeführt werden.Um es zusammenzufassen, verwenden Sie einen Standard-Python-Logger mit einem
QueueHandler
in all Ihren Mitarbeitern, Kunden und Brokern und erstellen Sie einen unabhängigen Prozess basierend aufQueueListener
und den Python-logging
Handlern Ihrer Wahl, um das schwere Heben der Protokollierung zu bewältigen.quelle
Hierbei handelt es sich um radikal unterschiedliche Ansätze mit jeweils eigenen Vor- und Nachteilen, die Sie höchstwahrscheinlich in einem späteren Entwicklungsstadium feststellen werden:
Eine Möglichkeit, die Sie versuchen können, besteht darin, einen zusätzlichen Protokollierungs-Worker wie in Ansatz 1 zu haben. Sie können Ihre Mitarbeiter in einem Memcache-Protokollierungscluster protokollieren lassen, und der Protokollierungs-Worker überwacht die aktuelle Ressourcenlast und bei Überschreitung eines bestimmten Ressourcenladeparameters den Der Worker meldet sich bei einem Gerät mit eingeschränktem IOP (z. B. Festplatte) an.
Ich mag auch Jonathans Ansatz mit der Einschränkung, dass auch ich meistens Python 2.x verwende und dass Sie wahrscheinlich Ihr eigenes Protokollierungs-Backend einrichten müssten, um den Leistungsumfang wirklich zu verbessern.
Korrigieren Sie mich, wenn ich falsch liege, aber ich gehe davon aus, dass Sie eine wirklich datenintensive Aufgabe ausführen, wobei Speicher-IOPs Ihr Engpass sind.
Ein bequemer Weg wäre immer noch, den Broker die
brokerage
Protokollierung - in der beschriebenen Form - mit allen Nachteilen einer zentralen Brokerinstanz durchführen zu lassen. Wenn der Broker beispielsweise so stark nachgefragt wird, dass er nie mehr Luft zum Schreiben der zwischengespeicherten Protokolle in den Speicher bekommt, müssen Sie einen anderen Ansatz wählen.Sie können letztendlich mit einem Modell ohne Makler enden. Das ist mit den Arbeitern, die ihre Arbeit untereinander verwalten. In einem einfachen Beispiel durch einen verteilten Round-Robin- Algorithmus.
quelle