2009-04-22 6 views
0

Ich muss große Bilddateien in kleinere Bilddateien verarbeiten. Ich möchte die Arbeit auf viele "Slave" -Server verteilen, anstatt meinen Hauptserver damit zu beauftragen. Ich verwende Windows Server 2005/2008, C# und ASP.NET. Ich habe eine Menge Erfahrung in der Entwicklung von Webanwendungen, habe aber keine verteilten Systeme entwickelt. Ich hatte eine Vorstellung, dass diese gestaltet sein könnte wie folgt aussehen:Verteilen von Bildverarbeitung auf mehrere Windows-Server, Dateisperrung Q

1) Dateien würden in einem gemeinsam genutzten Netzlaufwerk platziert werden

2) Slave-Server in regelmäßigen Abständen den Antrieb für neue Inhalte

3) Slave abfragen würden Server würden neu gefundene Dateien in etwas wie UNPROCESSED_appIDXXXX_jidXXXXX_photooidXXXXX.tif umbenennen und mit der Verarbeitung dieser Datei beginnen.

4) Andere Slave-Server würden den Versuch vermeiden, laufende Dateien zu verarbeiten, indem sie den Dateinamen prüfen, d. H. Wenn etwas mit "UNPROCESSED" benannt wurde, versucht es nicht zu verarbeiten.

ich ein paar Dinge, frage mich:

1) Wird es Probleme mit zwei Slave-Server versuchen, die Datei zu „greifen“ und benennen Sie sofort die Datei, oder wird Windows Server automatisch sperren?

2) Was ist Ihrer Meinung nach der beste Mechanismus für die Benachrichtigung über neue Inhalte für die Verarbeitung? Eine einfache Idee ist, eine grundlegende Aspx-Seite auf jedem Slave-System zu schreiben und es auf einem Timer laufen zu lassen. Eine bessere Idee könnte sein, einen Windows-Dienst zu schreiben, der SystemFileWatcher verwendet und auf jedem Slave-System ausgeführt wird. Eine dritte Idee ist, dass ein zentraler Server Anweisungen an einen gegebenen Slave-Server schickt, um einen Verarbeitungsjob zu versuchen, aber ich weiß nicht, wie ich diese Art von Kommunikation über einen sehr hack-ischen Ansatz hinaus ausführen kann Nachricht über HTTP.

Ich würde sehr schätzen jede Beratung, die Sie anbieten müssen.

Cheers, -KF

Antwort

0

Wenn Sie mit einem compute cluster type solution den ganzen Weg nicht gehen wollen. Sie sollten erwägen, einen Jobmanager zu haben, der irgendwo die Arbeit verteilt. Wenn ein Server für die Arbeit zur Verfügung steht, fordert er den Jobmanager auf, etwas zu tun. Er kann dem Jobmanager dann mitteilen, dass er beendet ist, und der Jobmanager kann Ihren "Kunden" informieren, wenn die Arbeit an dem gesamten Job abgeschlossen ist. Auf diese Weise ist es einfach, die Arbeit zu registrieren und zu wissen, dass sie abgeschlossen ist, und der Job-Manager kann die Arbeit verteilen, ohne sich um die Bedingungen beim Umbenennen von Dateien sorgen zu müssen. :)

+0

Gute Idee, danke. Haben Sie irgendwelche Kommunikationsmechanismen, wie der "Client" mit dem "Jobmanager" kommunizieren soll? Eine Möglichkeit, dies zu tun und dennoch eine ziemlich entkoppelte Lösung sicherzustellen, besteht darin, alle Informationen in einer einzigen Datenbank zu speichern: Job-Zuweisungen können nach Bedarf ausgehen, eine Erfolgsmeldung kann in der Datenbank notiert werden. Es könnte sogar denkbar sein, dass mehrere "Job Manager" auf die Daten verweisen und Jobs nach Bedarf zuweisen ... – kendor

+0

Eine db für den Job Manager ist eine gute Idee b/c, die Dauerhaftigkeit von Jobs und Rückverfolgbarkeit ermöglicht. Mitarbeiter können beispielsweise über einen WCF-Webdienst mit dem Jobmanager kommunizieren. Aber Sie sollten auch andere Grid-Lösungen wie http://ngrid.sourceforge.net/ ausprobieren. –