0

Ich habe eine Spring-Boot-Anwendung, die beim Start ca. 300 MB Daten herunterlädt und in einem Pfad /app/local/mydata speichert. Derzeit habe ich nur eine Entwicklungsumgebung mit einem einzigen Knoten und es ist kein Problem. Sobald ich jedoch eine Prod-Instanz mit (zum Beispiel) 10 Knoten erstelle, wäre es eine Verschwendung von Datenbandbreite für jeden Knoten, die gleichen 300 MB-Daten einzeln herunterzuladen. Der Dienst, von dem die Daten heruntergeladen werden, wird stark beansprucht. Und es gibt Kosten im Zusammenhang mit Daten, die in EC2 fließen.Daten über Amazon Elastic Beanstalk-Knoten teilen

Ich kann eine Logik mit einer Touchfile erstellen, um sicherzustellen, dass nur eine Box die Daten herunterlädt und andere nur warten, bis der Download abgeschlossen ist. Allerdings weiß ich nicht wo diese Daten herunterladen, so dass die anderen Knoten es auch lesen können.

Irgendwelche Vorschläge?

Antwort

1

Laden Sie es in S3 herunter, wenn Sie es in einer Datei behalten möchten, aber es klingt, als müssten Sie die Daten in eine Datenbank (RDS) legen oder in Redis (ElastiCache) zwischenspeichern.

Ich bin mir nicht sicher, was eine "Touchfile" ist, aber ich nehme an, Sie meinen eine Art Dateisperrmechanismus. Ich sehe das nicht als die beste Möglichkeit, dies über mehrere Server hinweg zu koordinieren. Ich würde wahrscheinlich eine DynamoDB-Tabelle mit konsistenten Lesevorgängen und bedingten Schreibvorgängen als verteilten Sperrmechanismus verwenden.

Wie oft ändern sich die Daten, die Sie herunterladen? Vielleicht könnten Sie einfach eine Lambda-Funktion planen, um die Daten regelmäßig zu aktualisieren und eine Datenbank oder etwas zu aktualisieren?

Im Allgemeinen müssen Sie aufhören, über das lokale Dateisystem des Webservers für diese Art von Sache zu denken.

+0

Der Dienst lädt alle 3 Stunden rund 300 MB herunter. Es gibt bereits eine '@ Geplante' Spring Annotation, die den Download alle 3 Stunden auslöst. Der 'Touchfile' Trick ist in der Tat, was Sie verstehen. Und ich stimme zu, dass dies kein guter Weg ist. Ich mag deinen Vorschlag, S3 zu verwenden. Kann es geschrieben und gelesen werden, wie Sie es von einem Java 'FileSystem' könnten? Wenn nicht, dann hätte ich ein Problem, weil die Bibliothek, die ich verwende, Daten in ein 'Dateisystem 'herunterlädt. Ich kann die Bibliothek leider nicht ändern. – Nik

+0

Das scheint etwas zu sein, das am besten als geplanter Job behandelt wird, der auf einem einzelnen Server ausgeführt wird. Sie können dies möglicherweise über Lambda planen, wenn es weniger als 5 Minuten dauert, die Daten herunterzuladen und zu verarbeiten. Sonst würde ein Cron-Job wahrscheinlich am besten funktionieren. –

+1

Ich würde vorschlagen, mehr über die verschiedenen verfügbaren AWS-Dienste und deren Funktionsweise zu erfahren. Die Verwendung von '@ Geplant 'bedeutet, dass der Job auf jedem Webserver ausgeführt wird. Jetzt müssen Sie sich also mit Nebenläufigkeitsproblemen herumschlagen und sich außerdem Sorgen um die Scale-Down-Operationen von Elastic Beanstalk machen, die den Server, der sich gerade in der Mitte befindet, um Ihre Daten herunterzuladen, zum Absturz bringen. Wenn ich es wäre, würde ich keine geplanten Jobs auf Elastic Beanstalk ausführen. –