Wie zuverlässig Dateien in regelmäßigen Abständen von einem externen Agenten hochgeladen handhaben?

StackOverflow https://stackoverflow.com/questions/622392

Frage

Es ist ein sehr häufiges Szenario: einiger Prozess will eine Datei auf einem Server alle 30 Minuten oder so fallen zu lassen. Einfach, nicht wahr? Nun, ich kann denken Sie an eine Reihe von Möglichkeiten, dies schief gehen könnte.

Zum Beispiel kann nimmt eine Datei Verarbeitung mehr oder weniger als 30 Minuten, so dass es möglich ist, für eine neue Datei zu gelangen, bevor ich mit dem vorherigen fertig bin. Ich habe nicht das Quellsystem will eine Datei zu überschreiben, dass ich immer noch verarbeiten.

Auf der anderen Seite sind die Dateien sehr groß, so dass es einige Minuten dauert sie das Hochladen zu beenden. Ich möchte nicht, die Verarbeitung eine Teildatei starten. Die Dateien werden nur mit FTP oder SFTP (meine Vorliebe) tranferred, so OS-Level-Locking ist keine Option.

Schließlich, ich brauche die Dateien um für eine Weile zu halten, für den Fall, muss ich manuell einen von ihnen prüfen (für das Debuggen) oder ein neu verarbeiten.

Ich habe eine Menge von Ad-hoc gesehen nähert sich Upload-Dateien um zu schlurfen, Dateinamen tauschen, mit Datumsstempel, „Anzeige“ Dateien berühren synchron zu unterstützen, und so weiter. Was ich noch nicht gesehen haben ist ein umfassender „Algorithmus“ für die Verarbeitung von Dateien, die Gleichzeitigkeit Adressen, Konsistenz und Vollständigkeit.

So, würde Ich mag hier in die Weisheit der Massen zu erschließen. Hat jemand eine wirklich kugelsicher Weise gesehen Batch-Dateien zu jonglieren so dass sie nie zu früh verarbeitet, überschrieben nie zuvor getan, und sicher gehalten nach der Verarbeitung?

War es hilfreich?

Lösung

Der Schlüssel ist die anfänglichen Jonglieren am Senden Ende zu tun. Alle Sender tun muss, ist:

  1. Speichern Sie die Datei mit einem eindeutigen Dateinamen.
  2. Sobald die Datei gesendet wurde, verschieben Sie es genannt zu einem Unterverzeichnis z.B. completed.

Es Unter der Annahme ist nur ein einziger Empfänger Prozess, alle Empfänger tun muss, ist:

  1. scannen regelmäßig die completed Verzeichnis für alle Dateien.
  2. Sobald eine Datei in completed erscheint, verschieben Sie es genannt zu einem Unterverzeichnis z.B. processed und startet von dort daran zu arbeiten.
  3. Optional löschen, wenn Sie fertig.

Auf jedem vernünftiges Dateisystem, Datei bewegt Atome sofern sie in dem gleichen Dateisystem / Volumen auftreten. So gibt es keine Rennbedingungen.

Mehrere Empfänger

Wenn die Verarbeitung länger als die Periode zwischen Dateien nehmen könnte geliefert werden, werden Sie einen Rückstand aufbauen, wenn Sie mehrere Empfänger-Prozesse haben. Also, wie der Multi-Empfänger-Fall behandeln?

Ganz einfach: Jeder Empfänger Prozess funktioniert genau wie zuvor. Der Schlüssel ist, dass wir versuchen, eine Datei zu bewegen processed vor daran zu arbeiten: das, und die Tatsache, die same-Dateisystem-Datei bewegt sich atomar sind, bedeutet, dass selbst dann, wenn mehrere Empfänger sehen die gleiche Datei in completed und versuchen, sie zu bewegen, wird nur ein Erfolg. Alles, was Sie tun müssen, ist der Rückgabewert von rename(), oder was auch immer OS rufen Sie die Bewegung ausführen verwenden stellen Sie sicher, zu überprüfen, und nur mit der Verarbeitung fortfahren, wenn es erfolgreich war. Wenn der Umzug fehlgeschlagen ist, bekam ein anderer Empfänger zuerst da, so gehen Sie einfach zurück und scannen Sie das completed Verzeichnis wieder.

Andere Tipps

Wenn das Betriebssystem unterstützt wird, verwenden Dateisystem Haken öffnen und schließen Dateioperationen abzufangen. So etwas wie Dazuko . Andere Betriebssysteme können Sie in anoter Weise wissen über Dateioperationen lassen, zum Beispiel Novell Open Enterprise Server können Sie Epochen definieren, und lesen Liste der Dateien, die während einer Epoche geändert.

gerade realisiert, dass in Linux, Sie inotify Subsystem oder die Dienstprogramme von inotify-Tools-Paket

verwenden können,

Die Übertragung von Dateien ist einer der Klassiker der Systemintegration. Ich würde Ihnen empfehlen, die Enterprise Integration Patterns Buch zu bekommen, um Ihre eigene Antwort auf diese Fragen zu bauen - zu ein gewisser Grad hängt die Antwort auf den Technologien und Plattformen, die Sie für Endpoint-Implementierung und für die Dateiübertragung verwenden. Es ist eine ziemlich umfassende Sammlung von bearbeitbaren Mustern und ziemlich gut geschrieben.

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