2017-12-21 38 views
0

일부 테스트 중에 한 팀에서 FTP를 통해 디렉토리에 액세스하려고 시도하는 시간 초과를보고했습니다. 그 원인은 수백만 개의 작은 파일을 생성하게 만든 코드의 버그였습니다.FTP가 페이징을 지원합니까?

시간 초과 이유는 요청에 디렉터리의 내용이 표시되도록 요청하고 모든 파일에 대해 단일 응답을 기다리는 것입니다.

대신 서버가 즉시 결과를 반환하기 시작하면 (생각하면 : yield returnreturn) 이는 시간 초과를 막을 수 있습니다. 마찬가지로 페이징 된 데이터를 반환 할 수있는 옵션이 있다면 해결 방법이 될 수 있습니다.

FTP가 request-response이므로 request-response-response-...이 아니기 때문에 yield return 시나리오는 불가능합니다. 그러나 페이징의 어떤 형태가있을 수 있습니다. 즉, 페이징은 일종의 정렬을 암시하기 때문에 해결책이되지 않을 것입니다. 그 자체로 파일 수에 따른 오버 헤드 조정이 발생합니다.

NB : 이것은 호기심에 관한 질문입니다. 이 문제를 해결하기 위해 단순히 디렉토리 (https://stackoverflow.com/a/6208144/361842)를 제거하기 만하면 실제 문제가 해결됩니다. 그러나 피드 결과를 다시 떨어 뜨릴 수있는 옵션이 있다면 폴더에있는 항목 수가 잠재적 인 문제가되지 않을 것입니다 (결과가 정렬되기 전/필터링되지 않은 한 반환됩니다).). 우리는 FileZilla Server과 .Net 클라이언트 (System.Net.FtpWebRequest)를 사용하고 있습니다. 그러나 이것은 이론적 인 것이므로 우리의 구현과 관련된 것보다 일반적인 대답에 더 관심이 있습니다.

답변

2

FTP에는 명시적인 페이징 지원이 없습니다. FTP 프로토콜은 사용자가 설명하는 문제와 관련이 없습니다. 디렉토리 목록의 경우 새 TCP 연결이 열리고 해당 연결의 첫 번째 바이트에서 마지막 바이트까지의 모든 것이 디렉토리 목록으로 간주됩니다.

그래서 서버는 원하는 경우 언제든지 디렉토리 목록을 다시 스트리밍 할 수 있으며 클라이언트는 수신 한 데이터를 자유롭게 표시 할 수 있습니다. 서버는 원할 때마다 디렉토리 목록을 다시 보내고, 조금 기다리고, 더 많은 항목을 보내고, 클라이언트는 도착한 디렉토리 목록을 자유롭게 표시하거나 전체 디렉토리 목록을 한꺼번에 표시 할 수 있습니다 응답을받습니다.

그러나 FTP 서버는 일반적으로 파일을 나열하기 위해 OS API에 바인딩됩니다. 운영 체제에 따라 디렉토리에있는 파일을 나열하는 API 호출은 파일을 많이 포함하는 디렉토리를 차단하고 매우 오랜 시간이 걸릴 수 있으며 기본적으로 한 번에 모든 목록을 다시 FTP 서버로 반환합니다.