Stellen Sie sich ein Szenario wie folgt vor: Nehmen wir an, Sie haben einen zentralen Computer, der viele Daten generiert. Diese Daten müssen verarbeitet werden, was leider länger dauert als die Generierung. Damit die Verarbeitung mit Echtzeit Schritt hält, schließen wir weitere Slave-Computer an.
Darüber hinaus müssen wir die Möglichkeit berücksichtigen, dass Slaves während des Jobs aus dem Netzwerk ausscheiden und zusätzliche Slaves hinzugefügt werden. Der Zentralcomputer sollte sicherstellen, dass alle Jobs zu seiner Zufriedenheit beendet werden und dass von einem Slave abgelegte Jobs an einen anderen zurückgegeben werden.
Die Hauptfrage lautet: Welchen Ansatz sollte ich verwenden, um dies zu erreichen?
Aber vielleicht hilft mir Folgendes, eine Antwort zu finden: Gibt es einen Namen oder ein Entwurfsmuster für das, was ich versuche zu tun?
Welchen Wissensbereich benötige ich, um das Ziel zu erreichen, dass diese Computer miteinander kommunizieren? (zB wird eine Datenbank, über die ich etwas weiß, ausreichen oder handelt es sich um Sockets, über die ich noch nichts weiß?)
Gibt es Beispiele für ein solches System? Die Hauptfrage ist etwas allgemein gehalten, daher wäre es gut, einen Startpunkt / Referenzpunkt zu haben.
Hinweis Ich gehe von Einschränkungen von C ++ und Windows aus, sodass Lösungen, die in diese Richtung weisen, willkommen wären.
Antworten:
Ja. Dieses Muster wird als verteiltes Rechnen bezeichnet (oder verteiltes Programmieren oder was auch immer für ein cooles Wort Sie nach dem Verteilen setzen möchten). Mein Vorschlag wird sein, dieses nicht im eigenen Haus zu bauen, bevor ich mir andere Lösungen anschaue. In dieser Frage zum Stapelüberlauf finden Sie verschiedene Optionen. Und dann kalkulierte Entscheidung treffen.
quelle
Wie aus anderen Antworten hervorgeht, ist dieses Gebiet als verteiltes Rechnen , Grid-Computing , Cluster-Computing und Hochleistungs-Computing bekannt .
Lassen Sie mich den Unterschied hinzufügen, dass ein System, dessen Größe nach dem Start an die Arbeitslast angepasst werden kann, als " elastisch " bezeichnet wird und sich vom herkömmlichen Grid-Computing unterscheidet. Dies ist einer der (nicht marketingbezogenen) Gründe für den Begriff " Cloud Computing ": Der Benutzer muss keine Kapazität einplanen, und die Anzahl und der Standort der Maschinen, die die Berechnung durchführen, bleiben ihm als Cloud unberührt.
Außerdem wird Ihre Anforderung, dass der Master fehlgeschlagene Aufgaben neu plant, als " Fehlertoleranz " -Eigenschaft dieses Systems bezeichnet. (Obligatorischer Link zu diesem Cartoon )
Welchen Ansatz sollten Sie verwenden, um Ihre eigene private Cloud zu erstellen? In meiner Bestellung oder Präferenz:
Erstellen Sie keine eigene Cloud , sondern nutzen Sie die von anderen bereitgestellte Infrastruktur. Amazon nennt diese Virtual Private Cloud , Rackspace nur Private Cloud . Ich bin sicher, Sie können andere Angebote finden und vergleichen.
Erstellen Sie keine eigene verteilte Computer-Engine , sondern verwenden Sie die von anderen bereitgestellte Engine. Wenn Sie darauf bestehen, Ihre Maschinen zu verwenden, verwenden Sie mindestens so viel Software wie möglich, die von anderen bereitgestellt und getestet wird. Sie können Hadoop von C ++ über die Pipes-Schnittstelle oder von jeder ausführbaren Datei über die Streaming-API verwenden . Es gibt eine ähnliche Streaming-Oberfläche für Spark .
Codieren Sie nicht alle Komponenten von Grund auf neu , sondern verwenden Sie Komponenten aus der Community. Wenn Sie aus irgendeinem Grund bisher gelesen haben und Ihre eigenen Cloud-Komponenten bereitstellen möchten, beginnen Sie nicht mit der Standardbibliothek von C ++. Die Hauptkomponenten, die Sie benötigen, sind:
Für beide gibt es viele Alternativen. Für die Warteschlange verfügt RabbitMQ ebenso wie ZeroMQ über ein Windows-Installationsprogramm . Für verteilte Dateisysteme habe ich wirklich nicht genug Erfahrung mit Windows: Es sieht so aus, als könnten Sie SMB-Freigaben in einer DFS organisieren , aber ich kann Ihnen hier keinen Hinweis geben. Sie könnten, wie in einer anderen Antwort erwähnt, denken, eine verteilte Datenbank wie MongoDB für die Daten zu verwenden. Es läuft unter Windows .
Sie können auch über die Verwendung von MPI nachdenken (normalerweise die OpenMPI-Implementierung , normalerweise über den Boost-Wrapper ). Beachten Sie jedoch, dass MPI-Programme an sich weder elastisch noch fehlertolerant sind. Sie müssen sich selbst darum kümmern (zumindest bieten sie einige Mechanismen, um dies zu erreichen ). Aus diesem Grund würde ich Ihnen empfehlen, zunächst ein Framework für die Verteilung zu evaluieren, das solche Eigenschaften aufweist.
quelle