3 Stimmen

Java EE-Anwendung mit lokaler Festplatte - Wie schlimm ist das?

Ok, wir haben also diese Anwendung, die wir auf unseren Servern installieren mussten. Es handelt sich um eine einzelne War-Datei, und wenn man sich zum ersten Mal bei dieser Anwendung anmeldet, wird ein Ordner auf der lokalen Festplatte erstellt.

Und aus irgendeinem Grund speichert die Anwendung hier Daten. Irgendeine Art von Statistik und Daten. Diese Anwendung verwendet auch eine Datenbank. Gott weiß, warum sie nicht alles dort speichern können.

Wenn ich einen Multi-Server-Cluster von Anwendungsservern betreibe, ärgert mich das. Kopieren des Ordners, Backup und allgemeine Vermüllung der Anwendungsserver.

Auf einer Skala von 1 bis 10. Wie schlecht ist dieses Design? Und würden Sie solche Anwendungen auf Ihrem Server zulassen?

2voto

sal Punkte 22948

Es ist ziemlich schlimm. Leider habe ich schon Schlimmeres gesehen.

Angenommen, Sie verbinden alle Knoten im Cluster mit einem gemeinsamen Festplattenbereich, um die Synchronisierung der Ordner zu vermeiden. Dann stellt sich die Frage, was passiert, wenn sich ein und derselbe Benutzer bei zwei Knoten gleichzeitig anmeldet. Was passiert, wenn er sich bei Knoten a und dann bei Knoten b anmeldet, sich dann von b abmeldet und zu Knoten a zurückkehrt? Angenommen, Sie beschließen, die Datenbank zu verwenden, um zu prüfen, ob der Benutzer angemeldet und aktiv ist. Was passiert, wenn der Benutzer eine Zeitüberschreitung hat? Er meldet sich bei Knoten a an und benutzt ihn. Er geht zum Mittagessen. Die Sitzung wird abgebrochen. Ist dann die Benutzung von Knoten b gesperrt? Auch von Knoten a?

So etwas würde hier niemals bei einer Entwurfsprüfung durchgehen. Der Zugriff auf eine nicht transnationale Ressource von einem Server aus ist ein Warnsignal, und ich erwarte vom Entwickler, dass er nachweist, wie er die Risiken minimiert hat. Normalerweise würde die Menge an Code, die man schreibt, um Designfehler zu umgehen, die Wartung zu teuer machen.

Es gibt verschiedene Möglichkeiten, die Sie ausprobieren können. So könnten Sie beispielsweise die Dateien auf einer Dateifreigabe speichern und die Datenbank verwenden, um eine Abstraktion des Dateinamens auf Anwendungsebene dem physischen Speicherort der Datei zuzuordnen. Sie könnten Transaktionen verwenden, um die Zeilen in der Datenbank zu sperren, während auf die Dateien zugegriffen wird. Sie müssten sich bei der Implementierung eines solchen Stinkersystems die Nase zuhalten, aber Sie wären die komplizierte Benutzerdateistruktur los, während Sie an einer besseren Lösung arbeiten.

Ich habe an einer schrecklichen Servlet-Anwendung gearbeitet, die PDF-Dateien erstellt. Die Erstellung konnte zwischen 20 Minuten und einer Stunde dauern, weil der Bericht aus Hunderten von Seiten mit Diagrammen und Tabellen bestand. Jedes Diagramm und jede Tabelle hatte eine oder drei Abfragen hinter sich. Zunächst wurden die Aufträge über einen Thread erstellt, der vom Servlet gestartet wurde und eine Datei in das WEB-INF-Verzeichnis schrieb. Wenn der Benutzer benachrichtigt wurde, dass die Datei erstellt wurde, schickte das Download-Servlet die Datei und löschte sie von der Festplatte. Das war wie eine Checkliste für schlechte J2ee-Praktiken. Wir umgingen dies, indem wir die Webanwendung eine Auftragsanforderung in eine Tabelle schreiben ließen und dann einen anderen Prozess die Tabelle nach Aufträgen durchsuchen ließen. Sobald die PDF-Datei fertig war und an den FTP-Speicherort kopiert wurde, wurde die URL in eine Tabelle geschrieben und ein Link wurde auf dem Bildschirm des Benutzers angezeigt. Die Downloads wurden von einem anderen Server als einfache statische Inhalte bereitgestellt.

1voto

djna Punkte 53789

Erste Frage: Kann dies überhaupt in einem Cluster funktionieren?

Ist es sinnvoll, diese Daten auf die Festplatten mehrerer Server aufzuteilen? Werden die "Antworten" noch korrekt sein?

Wenn es sich um eine Art Scratchpad handelt, also um Zwischenergebnisse für eine einzelne Berechnung, dann ist es zwar nicht ideal, aber auch nicht aktiv schädlich.

Es entspricht eindeutig nicht den Java EE-Standards, der direkte Zugriff auf die lokale Festplatte ist ein Tabu, ebenso wie das Starten eigener Threads. Aber es gibt viele Anwendungen auf der Welt, die bereit sind, gegen die Buchstaben dieser Standards zu verstoßen.

Müssen Sie diese Dateien sichern, oder sind sie nur ein Notizbuch? Wenn sie formal sind Daten Der Verlust dieser Eigenschaft beeinträchtigt die Konsistenz, und ich wäre sehr unglücklich, wenn ich dies in der Produktion hätte.

0voto

Leonel Martins Punkte 2645

Speziell in Ihrem Fall klingt das nach einem schlechten Design. Ich würde ein solches System nicht auf einem Produktionsserver zulassen. Abgesehen davon sehe ich ein Beispiel, bei dem ich die Dateien lieber auf dem Dateisystem als in der Datenbank ablegen würde (fast wie sal Beispiel): wenn Sie Berichte im PDF-Format für die Benutzer erstellen und diese die Dateien auf dem Server hinterlassen können. In diesem Fall möchte ich diese Dateien nicht in der Datenbank ablegen. Wenn sie verloren gehen, ist das keine große Sache. Sie können mit den Informationen aus der Datenbank wiederhergestellt werden. Und sie vergrössern die Datenbanksicherung nicht.
Man könnte sagen, dass die Anwendung, die das PDF erzeugt, ein weiterer Prozess/Anwendung ist, aber IMHO ist sie Teil des Systems und sollte daher als Java EE-Anwendung betrachtet werden. Daher ist das obige Szenario ein Beispiel für einen legitimen Zugriff auf das Dateisystem innerhalb einer Java EE-Anwendung.

0voto

OpenSource Punkte 2147

Wir sind eine Java EE-Anwendung, und zwar eine ziemlich erfolgreiche, und unser gesamtes System dreht sich um Dateien. Natürlich speichern wir nicht auf einem lokalen Laufwerk. Wir haben einen separaten Rechner für die Speicherung unserer Dateien. Ich denke nicht, dass es schadet, sich mit dem Dateisystem zu beschäftigen, wenn das Ihre Frage ist. Wenn Sie einen zentralen Speicherort für die Dateien haben (z. B. einen gemeinsamen Speicherort für alle Server in Ihrem Cluster), sollte alles in Ordnung sein.

0voto

Ryan Fernandes Punkte 7942

Sehen Sie sich das an und setzen Sie es ein mit dem Rücken zur Wand :( Wir haben ein SAN verwendet und es auf die verschiedenen Server im Cluster gemountet, wobei wir denselben Namen als Einhängepunkt auf jedem von ihnen verwendet haben.

Es hat funktioniert. Es ist nicht großartig, aber es hat funktioniert und es funktioniert immer noch.

Um Ihre eigentliche Frage zu beantworten: 1. Der Entwickler könnte einen triftigen Grund dafür haben, es auf diese Weise zu gestalten Siehe auch Leonel Martins Antwort. 2. Wenn Sie der Bereitsteller sind und es sich um eine geschäftskritische Anwendung handelt, die Sie unbedingt in die Produktivumgebung bringen müssen, dann ist das nicht unmöglich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X