2017-12-21 6 views
0

Während eines Tests hat eines unserer Teams Timeouts gemeldet, die versuchten, über FTP auf ein Verzeichnis zuzugreifen. Die Ursache war ein Fehler in ihrem Code, der Millionen winziger Dateien verursacht hatte.Unterstützt FTP Paging?

Aus meinem Verständnis der Grund für die Zeitüberschreitung ist die Anfrage fragt nach dem Inhalt des Verzeichnisses aufgelistet werden, und wartet auf eine einzige Antwort mit allen Dateien.

Wenn stattdessen der Server sofort begann, die Ergebnisse so zurückzugeben, wie sie gefunden wurden (think: yield return vs return), würde dies die Zeitüberschreitung verhindern. Wenn es eine Option zum Zurücksenden von seitenweisen Daten gibt, könnte dies zu einer Problemumgehung führen.

Da FTP ist request-response, anstatt request-response-response-... Ich stelle mir das yield return Szenario ist nicht möglich; aber irgendeine Form von Paging kann sein. Das heißt, vielleicht würde dies keine Lösung ergeben, da das Paging eine Art von Sortierung beinhaltet, was wiederum eine Skalierung mit der Anzahl der Dateien nach sich ziehen würde.

NB: Dies ist eine Frage aus Neugier; Unser wirkliches Problem wurde gelöst, indem ich einfach das Verzeichnis löschte (https://stackoverflow.com/a/6208144/361842), um das Problem zu lösen. Allerdings denke ich, wenn es eine Option gäbe, Feed-Ergebnisse zurückzufluten, würde die Anzahl der Elemente in dem Ordner kein potentielles Problem mehr sein (solange wir die Ergebnisse nicht sortieren/filtern/usw. bevor sie zurückgegeben werden)). Wir verwenden FileZilla Server und einen .Net-Client (System.Net.FtpWebRequest); Aber da dies theoretisch ist, bin ich an generischen Antworten mehr interessiert als an denen, die für unsere Implementierung spezifisch sind.

Antwort

2

FTP hat keine explizite Paging-Unterstützung. Das FTP-Protokoll befasst sich nicht mit dem von Ihnen beschriebenen Problem. Bei einer Verzeichnisauflistung wird eine neue TCP-Verbindung geöffnet, und es wird angenommen, dass alles vom ersten Byte bis zum letzten Byte dieser Verbindung die Verzeichnisauflistung ist.

So - der Server ist frei, um die Verzeichnisliste jedoch/wann immer es will, zu streamen, und ein Client ist frei, die Daten anzuzeigen, die er jedoch empfängt/wann immer es mag. Der Server kann einige der Verzeichnislisten zurücksenden, wann immer er will, ein wenig warten, ein paar weitere Einträge senden usw., und der Client kann die Verzeichnisliste so anzeigen, wie sie ankommt, oder sie alle auf einmal anzeigen, wenn die gesamte Liste angezeigt wird Antwort wird empfangen.

Beachten Sie jedoch, dass FTP-Server normalerweise an die OS-API gebunden sind, um Dateien aufzulisten. Abhängig von dem Betriebssystem, dem Dateisystem usw., das die API zum Auflisten von Dateien in einem Verzeichnis aufruft, kann es sehr lange für ein Verzeichnis mit vielen kleinen Dateien blockieren und im Grunde genommen alle Auflistungen zurück auf den FTP-Server zurückgeben.