빠르고 가벼운 파일 서버를 구현하기 위해 무엇을 사용 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/760114

  •  09-09-2019
  •  | 
  •  

문제

데스크탑 응용 프로그램의 일환으로 파일 서버가 있어야합니다. 파일 서버는 최대한 빨리 응답해야합니다 (일반적으로 동일한 LAN에있는 원격 클라이언트에서). 작은 크기의 파일에 대한 파일 요청이 많이 있습니다. 서버는 업로드 및 다운로드 서비스를 모두 제공 할 수 있어야합니다.

나는 어떤 미인 기술에 빡빡하지 않으므로 Windows에서 실행할 수있는 한 프로그래밍 언어, 툴킷, 라이브러리에 열려 있습니다.

초기 테이크는 Windows 소켓을 사용하여 C/C ++ 구현을 사용하거나 Boost (ASIO 등)와 같은 라이브러리에서 제공하는 서비스를 사용하는 것입니다. 나는 또한 Erlang에 대해 생각했지만 배워야 할 것이므로 성과 이점은 언어를 배워야하기 때문에 개발 시간이 증가해야합니다.

나중에 편집 : FTP 또는 HTTP를 사용하거나 기본적으로 이미 만들어졌지만 여전히 처음부터 작성하고 싶다고 생각하는 답변에 감사드립니다.

도움이 되었습니까?

해결책

소규모 파일의 자주 업로드하는 경우 가장 빠른 방법은 자체 독점 프로토콜을 구현하는 것이지만 상당한 양의 작업이 필요할 것입니다. 또한 비표준이므로 구현할 수 없다면 향후 통합이 어려울 것입니다. 지원하는 고객의 프로토콜. 어쨌든 당신이 그것을 선택한다면, 이것은 간단한 프로토콜에 대한 나의 제안입니다.

  1. 명령 : 1 바이트는 수행 할 작업을 식별하기 위해 : (0x01 업로드 요청의 경우 0x01, 다운로드 요청의 경우 0x02, 업로드 응답의 경우 0x11, 다운로드 응답의 경우 0x12 등).
  2. 파일 이름 : 길이에 대한 바이트로 고정 크기 또는 접두사로 표시 될 수 있습니다 (이름이 255 바이트 미만이라고 가정)
  3. CheckSum, MD5 예를 들어 (요청 또는 다운로드 응답을 업로드하는 경우)
  4. 파일 크기 (요청 또는 다운로드 응답을 업로드하는 경우)
  5. 페이로드 (요청 또는 다운로드 응답을 업로드하는 경우)

이것은 간단한 TCP 소켓 위에 구현 될 수 있습니다. 연결을 설정하는 데 드는 비용을 피하고 UDP를 사용할 수도 있지만이 경우 재전송 제어를 처리해야합니다.

자신의 프로토콜을 구현하기로 결정하기 전에 libcurl과 같은 HTTP 라이브러리를 살펴보면 서버에서 다운로드를 위해 Get for Upload와 같은 표준 HTTP 명령을 사용하도록 할 수 있습니다. 이렇게하면 많은 작업이 절약되며 웹 브라우저로 다운로드를 테스트 할 수 있습니다.

성능을 향상시키기위한 또 다른 제안은 파일 시스템이 아니라 SQLite와 같은 파일 저장소로 사용하는 것입니다. 파일 이름에 대해 하나의 숯 열이 포함 된 단일 테이블과 파일 내용의 경우 하나의 블로브 열을 만들 수 있습니다. SQLITE는 가볍고 효율적인 캐싱을 수행하므로 대부분의 경우 디스크 액세스 오버 헤드를 피할 수 있습니다.

클라이언트 인증이 필요하지 않다고 가정합니다.

마지막으로 : C ++가 원시 코드 속도를 제공하는 것을 선호하지만, 이런 종류의 응용 프로그램의 주요 병목 현상은 거의 없습니다. 대부분은 디스크 액세스 및 네트워크 대역폭 일 것입니다. Java에서는 아마도 100 줄 미만의 코드로 http를 다운로드하고 업로드하기 위해 HTTP를 사용하여 똑같은 일을 할 수 있기 때문에 이것을 언급하고 있습니다. 이 경우 SQLITE 대신 Derby를 사용하고 해당 서블릿을 컨테이너 (Tomcat, Glassfish 등)에 넣으면 완료됩니다.

다른 팁

왜 그냥 가십시오 ftp? 모든 언어 및 클라이언트 액세스 라이브러리에서도 적절한 서버 구현을 찾을 수 있어야합니다.

많은 휠 보장처럼 들립니다. 물론 FTP는 이상적이지 않으며 몇 가지 이상한 지점이 있지만 ... 표준, 잘 알려져 있으며 이미 매우 널리 구현되었습니다.

모든 기계가 동일한 LAN의 Windows에서 실행중인 경우 왜 서버가 필요합니까? Windows 파일 공유를 사용하는 이유는 무엇입니까?

FTP, SFTP 또는 기타 연결 지향 기술을 사용하지 않는 것이 좋습니다. 대신, 연결없는 프로토콜이나 기술을 찾으십시오.

그 이유는 많은 작은 파일을 업로드하거나 다운로드 해야하는 경우 가능한 한 빨리 응답이 있어야하는 경우 연결을 설정하고 파괴하는 데 드는 비용을 피하고 싶습니다.

기존 구현을 사용하거나 자신의 HTTP 또는 HTTPS 서버/서비스를 구현하는 것이 좋습니다.

병목 현상은 다음 소스 중 하나에서 나올 가능성이 높습니다.

  • 하드 디스크 I/O- WD VelocirAptor의 무작위 액세스 속도는 약 100MB/s입니다. 또한 RAID0,1,5로 설정했는지 또는 그렇지 않은지 여부는 중요합니다. 일부는 빨리 읽지 만 느리게 씁니다. 트레이드 오프.

  • 네트워크 I/O- GBIT I/O를 사용하지 않는 한 빠른 습격 설정에 가장 빠른 하드 디스크가 있다고 가정하면 네트워크가 느려집니다. 파이프가 크면 여전히 데이터를 제공해야합니다.

  • 메모리 캐시-메모리 내 파일 시스템 캐시는 모든 네트워크 I/O를 버퍼링하여 속도를 늦추지 않도록 충분히 커야합니다. 그것은 당신이보고있는 일의 종류에 대한 많은 양의 기억이 필요합니다.

  • 파일 시스템 구조-기가 바이트의 메모리 가치가 있다고 가정하면 병목 현상은 파일 시스템에 사용하는 데이터 구조 일 가능성이 높습니다. 파일 시스템 구조가 번거 롭다면 속도가 느려집니다.

다른 모든 문제가 해결되었다고 가정하면 응용 프로그램 자체에 대해 걱정하십니까? 대부분의 병목 현상은 소프트웨어 제어 외부에 있습니다. 따라서 C/C ++로 코딩하든 특정 라이브러리를 사용하든 여전히 OS와 하드웨어의 자비에 달려 있습니다.

당신이 사용해야하는 것처럼 들립니다 SFTP (SSH) 서버, 그것은 방화벽/nat 안전하고 안전하며, 이미 원하는 것 이상을 수행합니다. 더 간단한 구현을 위해 Samba 또는 Windows 파일 공유를 사용할 수도 있습니다.

예를 들어 일반 웹 서버는 기존의 것을 사용하지 않겠습니까? 일반 웹 서버는 많은 작은 파일 (이미지)을 매우 잘 처리합니다.

그리고 많은 사람들이 이미 코드를 최적화하는 데 시간을 보냈습니다.

두 번째 이점은 전송이 확립 된 프로토콜 인 HTTP로 수행된다는 것입니다. 더 많은 보안이 필요한 경우 SSL로 쉽게 전환됩니다.

업로드의 경우 스크립트 또는 사용자 정의 모듈에도 아무런 문제가 없습니다. 동일한 방법으로 승인을 추가 할 수도 있습니다.

파일을 동적으로 찾을 필요가없는 한 이것이 최고의 솔루션 중 하나라고 생각합니다.

기존 데스크톱 응용 프로그램의 새로운 부분입니까? 서버의 목표는 무엇입니까? 업로드/다운로드 된 파일을 보호하고 인증 및/또는 승인을 제공하고 있습니까? 업로드가 저장 될 수있는 일종의 구조를 제공합니까?

한 가지 옵션은 컴퓨터에 Apache HTTP 서버를 설치하고 파일을 통해 제공하는 것입니다. 게시물을 사용하여 업로드하고 다운로드하십시오.

고객이 LAN 내에 있다면 운전 만 공유 할 수 없습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top