# Direkter Datenaustausch zwischen Servern



## jensebluemchen (25. Feb 2014)

Hallo zusammen,

ich konnte nach einer Suche bei Google und im Forum leider noch keine passende Antwort zu meiner Frage finden:

Es geht um das Kopieren von Dateien zwischen zwei FTP-Verzeichnissen. Zum Hintergrund:
Ich habe eine klassische Java-Client/Server-Webanwendung (Spring, JSF, Hibernate). Benutzer meiner Anwendung können Zugänge zu zwei FTP-Verzeichnissen A und B konfigurieren. Meine Webanwendung zeigt die beiden Verzeichnisse dann in einem Fenster links (A) rechts (B) an.
Jetzt möchte ich eine Funktion anbieten, mit der die Benutzer eine Datei von A nach B kopieren können. Klar, ich könnte die Datei von A zunächst auf meinen App-Server X kopieren und von dort dann nach B übertragen:

Client möchte Datei kopieren 
   ---> Client-Browser zeigt Dateien an
   ---> Appserver X lädt Datei <---> Server A
   ---> Appserver X transferiert Datei ---> Server B
   ---> Client-Browser zeigt Dateien an

Diesen Umweg über meinen Appserver möchte ich wenn möglich umgehen, da dies eine sehr hohe Last und Datenverkehr auf dem Server bei vielen Benutzern erzeugen würde. Leider kenne ich mich hier technisch nicht wirklich aus. Gibt es bessere Möglichkeiten, zur "direkten" Übertragung der Dateien? Kann das irgendwie über den Client passieren, etwa so:

Client möchte Datei kopieren 
   ---> Client-Browser zeigt Dateien an
   ---> Zu kopierende Datei wird direkt in den Client geladen <---> Server A
   ---> Client transferiert Datei ---> Server B
   ---> Client-Browser zeigt Dateien an

Ist so etwas technisch möglich? Wenn ja, mit welchen Java-Technologien kann ich hier arbeiten? Oder kennt ihr weitere Möglichkeiten, um meinen Appserver zu entlasten?

Vielen Dank schonmal für eure Hilfe!

LG Jens


----------



## mjustin (26. Feb 2014)

Wenn der / die Server FXP unterstützen, kann der Appserver einen direkten site-to-site Kopiervorgang verwenden:

File Exchange Protocol ? Wikipedia


----------



## jensebluemchen (26. Feb 2014)

Danke erstmal!

Cool, FXP habe ich noch nicht gekannt und die Implementation mit Java scheint auch einfach zu sein:
Managed File Transfer and Security Solutions: Using FXP with Java

Mit FXP wird der Transfer der Daten dann also direkt zwischen den beiden FTP-Servern ausgeführt. Ohne FXP müsste ich das File ja von FTP A direkt auf meinen App-Server und von dort nach FTP B transferieren. Mit FXP kann ich also den Kopiervorgang direkt zwischen FTP A und B anstossen.

Wenn ich nun aber z.B. FXP nicht verwenden kann, sagen wir, ich möchte mit meiner Webanwendung eine Datei von FTP A in ein Dropbox-Verzeichnis (per Dropbox Java API) kopieren. Gibt es hier auch noch Möglichkeiten ohne meinen Appserver zu belasten? Also kopieren über den Client/Browser des Users und nicht mit Umweg über meinen Appserver?

Vielen Dank und LG


----------



## Sen-Mithrarin (27. Feb 2014)

hör dir doch bitte mal selbst zu

was du willst : eine direkte inter-server-kommunikation zwischen A und B gesteuert über deinen app-server X ... also A <-> B
was du aktuell hast : eine in-direkte multi-server-kommunikation zwischen A und B über deinen app-server X ... also A <-> X <-> B
was du jetzt plötzlich machen willst : einen file-transfer über den client ohne deinen app-server ... also A <-> client <-> B

was genau willst du dann jetzt ?


klar kannst du es über den client laufen lassen ... dann darfst du es aber erstmal nicht als direkten server-server-transfer anbieten sondern musst schon mal klar machen das die daten-last beim client anfällt ... und das doppelt : download + upload ... und das es auf grund des in der regel extrem langsamen upload-rate eines "normalen" privat-anschlusses *bei ADSL in der regel selbst mit doppelten upstream max um die 2048kBit/s / VDSL dagegen schon um die 5-10 MBit/s / Cable kommt entsprechend noch höher beim richtigen anbieter* extrem lange dauern wird


wäre für mich ein grund deinen "dienst" nicht zu nutzen


wenn du traffic und netz-last vermeiden willst ... dann biete es nicht an
wenn du keinen einfluss darauf hast wie die daten zwischen den server ausgetauscht werden können ... z.b. weil du nur ein interface anbietest und sich die user darüber z.b. in ihren ftp-acc und einen dropbox-acc einloggen können ... dann bleibt dir nur es entweder über deinen server oder über den client zu laden ... punkt aus ende fertig ... da gibts nichts mehr zu diskutieren


----------



## jensebluemchen (27. Feb 2014)

Ok, ich habe mich da vermutlich schlecht ausgedrückt. Ist eben nicht ganz so einfach zu beschreiben was man haben möchte, wenn man technisch noch nicht verstanden hat, wie es geht ;-)

*Also nochmal:*
Ich möchte, dass User über meine Webanwendung einen Quell- und einen Ziel-Server angeben können, egal ob FTP, Dropbox oder was es sonst vielleicht noch gibt.
Meine Überlegung war nun, dass mein Appserver performancemässig sehr schnell in die Knie gehen wird, wenn sehr viele User anfangen Dateien über meinen Appserver zu kopieren (A-->X-->B). Ich bin also auf der Suche nach einer besseren Lösung für dieses Problem und dachte mir, ok, vielleicht kann man das Kopieren auch irgendwie auf die Client-Maschinen auslagern!
FXP wäre eine tolle Lösung für eine direkte Übertragung (A-->B gesteuert über X), wenn es nur um FTP ginge, aber ich möchte hier möglichst flexibel bleiben. Dropbox bietet ja z.B. eine REST-Schnittstelle und FXP fällt damit schon raus.

Also wenn ihr mir sagt, dass das Kopieren über die Client-Maschinen nicht möglich oder nicht performant genug ist, dann muss ich mir etwas anderes überlegen. Vielleicht muss ich meine Anwendungsarchitektur überdenken und Cluster-fähig machen, um später einfach beliebige Server für den Filetransfer bereitstellen zu können!
Aber es geht hier auch nicht um riesige Datenmengen - es soll ja keine Tauschböre werden. Aber die User sollten schon ab und zu auch Ordner mit Fotos, etc. kopieren können.


----------



## Sen-Mithrarin (28. Feb 2014)

wie gesagt : wenn du direkte server<->server kommunikation nicht bewerkstelligen kannst weil dir die server nicht gehören ... und auch über deinen server am besten nichts laufen sollte weil du traffic und performance sparen willst (wobei es ja keine performance frisst wenn du z.b. ein applet auslieferst und auf dem server ein servlet läuft das alles regelt ... sondern nur traffic) ... und es dir zu un-performant ist die daten über den client zu schaufeln (was du ja eigentlich vermeiden willst) ... dann gehts nicht ... es gibt nur diese drei möglichkeiten



*klar ... man könnte irgendwelche free-hoster dafür missbrauchen um zumindest vom traffic her was zu sparen ... aber da braucht man dann schon "den richtigen" auf dem man dann z.b. über php auch direkt auf resourcen von anderen quellen zugreifen kann ... was ja bei den meisten blockiert ist


----------

