Frage

ich benutze Nulomq Um ein Problem zu lösen, bei dem mehrere hundert (möglicherweise Tausende) Kunden beantragt werden, werden Aufgaben auszuführen. Jeder Kunde beantragte, dass eine bestimmte Aufgabe ausgeführt wird, und die Ergebnisse, die nach Fertigstellung an den Kunden zurückgegeben werden, der diese Anfrage ausgestellt hat.

Dies sind die Schauspieler, die ich bisher identifiziert habe, in dem Muster, das ich mir entwickelt habe:

  • Kunde: Dies ist der Akteur, der eine Arbeitseinheit (oder "Job" beantragt, die durchgeführt werden kann
  • Controller: Dies ist der Akteur, der die "Jobs" -Prangsabrechnungen laden
  • Engine: Dies ist der Akteur, der eine Jobanfrage vom Controller erhält und das Ergebnis an den Client veröffentlicht.

Ich habe noch nicht herausgefunden, wie der Motor die Mesage wieder an den Kunden bringt. Ich vermute, dass eine Möglichkeit, dass dies mit Zeromq implementiert werden soll, sein würde:

Klient:
Drücken Sie Jobmeldungen auf einen Socket zum Controller ab, das abgeschlossene Ergebnisse auf der von Engine veröffentlichten Buchse auf einem anderen Socket abonniert hat

Regler:
Ziehen Sie Jobnachrichten von Client in einem Socket ab, veröffentlichen Bearbeitungsnachrichten an Motoren in einem anderen Socket (dies ist eindeutig ein Weiterleitungsgerät).

Motor:
Abonnieren Sie Jobnachrichten in einem Socket -Veröffentlichungsergebnis in einem anderen Socket

Es wäre am hilfreichsten, wenn jemand ein Skelett/einen Snippet zur Verfügung stellt, das den Überblick darüber zeigt, wie dieses Muster implementiert werden kann, unter Verwendung des Zeromq -Frameworks.

Das Code -Snippet kann in C, C ++, PHP, Python oder C# vorhanden sein

[Bearbeiten]

Nach dem Lesen über Taskfarmen (wie von Akappa vorgeschlagen). Ich denke, dieses Problem kann tatsächlich durch eine Aufgabenfarm modelliert werden. Ich habe meine ursprünglichen Schauspieler entsprechend geändert (und auch den Titel geändert).

Es wäre immer noch sehr nützlich, wenn jemand, der mit Zeromq vertraut ist, ein Skelett skizzieren kann, das zeigen, wie ich die Kernkomponenten verwenden kann, um ein solches Framework zu erstellen.

War es hilfreich?

Lösung

Es gibt eine Vielzahl von Ansätzen dazu und Ipython.parallel Enthält zwei solcher Implementierungen mit Zeromq - einem einfachen und reinen Zmq, und einem anderen, der aufwändiger ist, wobei der Controller in Python implementiert wird.

Wir teilen den Controller in zwei Schauspieler auf:

  1. Hub -Ein abgelegener Prozess, bei dem der gesamte Datenverkehr vorkommt und den Status des Clusters im Auge behält, die Ergebnisse in eine Datenbank überschreitet usw., die Clients über Engine Connect/Trennen usw. benachrichtigt usw.
  2. Planer - In seinem Kern ein einfaches Router-Dealer-Gerät, das Anfragen von den Clients an die Motoren weiterleitet, und die Antworten sichern.

Betrachten Sie nur den Aufgabenbetriebsteil unserer Topologie:

  • Scheduler ist ein 0MQ -Warteschlangengerät mit einem Router- und Händler -Socket, die beide binden.
  • Kunden haben Händler -Sockets, die mit dem Router des Schedulers verbunden sind
  • Motoren haben Router -Sockets, die mit dem Händler des Schedulers verbunden sind

Dies nutzt diese beiden Eigenschaften:

  • Händler LRU-Ladeausgleichsanfragen über Gleichaltrige hinweg
  • Router verwenden Identitätspräfixe, um Antworten an den Peer zurückzugeben, der eine bestimmte Anfrage gestellt hat.

Eine mit Pyzmq ausgeglichene Task-Farm mit einer mit Spielzeug ausgeglichenen Spielzeug, die sich wieder auf den anfordernden Kunden reagiert: https://gist.github.com/1358832

Eine Alternative, bei der die Ergebnisse irgendwohin gehen, aber nicht auf den anfordernden Kunden zurückgreifen, ist die Ventilator-Sink-Muster im 0mQ -Handbuch.

Andere Tipps

Dies ist ein klassischer Master-/Sklaven -Parallelmuster (auch als "Farm" oder "Task Farm" bezeichnet).

Es gibt Milliarden Möglichkeiten, es umzusetzen.Hier Es gibt eine Möglichkeit, es mit MPI zu implementieren. Möglicherweise kann es für Sie inspirierend sein, es in Zeromq implementieren zu können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top