2012-01-17 2 views
3

node.js의 파일에 대한 액세스를 조정하는 가장 좋은 방법은 무엇입니까?nodejs의 파일 시스템 활동 조정

재개 가능한 매우 큰 파일 (10sGB)에 대해 http 기반 파일 업 로더를 작성하려고합니다. 최선의 접근 방식이 동일한 파일을 동시에 업로드하려고하는 두 사람을 처리하는 것이 무엇인지 알아 내려고합니다 ... 또한 node.js의 복사본이 두 개 이상있는 가능성을 미리 생각하려고합니다. http 서버가로드 밸런서 뒤에 있기 때문에 중복 업로드를 포착하는 것은 코드 자체에만 의존 할 수 없습니다.

예를 들어, 파이썬에서는 open() 호출에 올바른 플래그를 전달하여 파일을 만들 수 있습니다. 기본 node.js 파일을 새로 열 때 기본 파일인지 확실하지 않습니다.

또 다른 옵션은 내가 생각하지만, 정말,이 상태를 추적하기 위해 원자 트랜잭션을 지원하는 비동기 드라이버 데이터베이스를 사용하고 추구하고 싶지 않아 ...

답변

0

node.js의 일부 항목에 대해 불평하는 사람에게 HackerNews에서이 사실을 알았습니다. 완전을 위해 여기에 넣을 것입니다. 이렇게하면 적어도 원하는대로 node.js에서 일부 파일 쓰기를 잠글 수 있습니다.

IsaacSchlueter 4 시간 전 | 링크

열려있는 플래그를 숫자로 전달하면 O_EXCL로 파일을 열 수 있습니다. (require ("constants")에서 찾을 수 있으며 함께 이진 OR 결합 된 해야합니다.)이 내용은 문서화되어 있지 않습니다. 그것은해야한다. 그것도 아마 깨끗한 방법으로 노출해야합니다. 의 나머지 부분은 대부분 세련되고 세련된 API입니다. 경계는이 시점에서 잘 정의되어 있습니다. 우리는 아마 이 시점에서 다른 내장 모듈을 추가하지 않거나 그 중 무엇을 할 수 있는지 극적으로 확장합니다 ( ).(나는 seek()를 극적으로 생각하지 않습니다.

0

여러 사용자가 있는지 알기 위해 동일한 파일을 업로드하면 파일을 어떻게 든 식별해야합니다. 해싱이 가장 좋습니다. 먼저 클라이언트 측에서 전체 파일을 해싱하여이를 식별합니다. 서버에 파일의 해시를 알려줍니다. 이미 서버에 동일한 해시가있는 파일이 있으면 파일이 이미 업로드되었거나 현재 업로드 중입니다.

http 파일 서버이므로 사용자가 브라우저에서 파일을 업로드해야 할 수 있습니다. File Reader API을 사용하여 브라우저로 파일 내용을 가져올 수 있습니다. 불행히도 현재로서는 this isn't widely supported입니다. 다른 브라우저에서 작동하려면 플래시와 같은 것을 사용해야 할 수도 있습니다.

파일 판독기로 파일을 메모리로 스트리밍 할 때 청크로 나누고 청크를 해시하는 것이 좋습니다. 그런 다음 서버에 파일의 모든 해시 청크를 보냅니다. 클라이언트가 하나의 해시를 보내고 전체 파일을 업로드 할 수 있기 때문에 전체 파일의 내용 대신 파일을 청크로 분해하고 개별 청크를 해시하는 것이 중요합니다.

해시를 받고 다른 파일의 해시와 비교 한 후 다른 사람이 현재 동일한 파일을 업로드하고있는 것으로 확인되면 서버는 어떤 사용자가 파일의 일부 청크를 업로드할지 결정합니다. 그런 다음 서버는 업로드 클라이언트에게 클라이언트가 원하는 청크를 알리고 클라이언트는 해당 청크를 업로드합니다.

각 청크 업로드가 완료되면 서버에서 다시 청취되고 원래 해시 배열과 비교되어 사용자가 올바른 파일을 업로드하는지 확인합니다.

+0

내가 정확히 설명했듯이 구현 한 것을 분명히해야합니다. 내가 당신에게 인용 할 부분에 대한 설명은 ... "다른 사람이 현재 같은 파일을 업로드하는 것으로 판명되면 서버는 어떤 청크를 업로드 할 것인지 결정합니다". node.js (세부 사항)에서 이것을 어떻게 구현합니까? 청크가 현재 업 로더에 의해 버려 졌는지 여부를 서버가 어떻게 구별합니까? 두 개의 청크가 동시에 업로드되면 어떻게하면 하나가 받아 들여지고 다른 하나는 거부 될 수 있습니다 (어떤 종류의 원자 적 연산)? – Cyclone

+0

1MB와 같이 청크 크기를 지정하고 사용자가 업로드하는 사이에 청크를 배포합니다. 일반적으로 첫 번째 사용자는 첫 번째 청크를 업로드하고 두 번째 사용자는 파일의 두 번째 절반을 업로드합니다. n 사용자가 동일한 파일을 업로드하기 시작하면 현재 업 로더의 나머지 청크 중 1/n을 가져 와서 새 사용자에게 넘깁니다. 각 클라이언트가 보내야하는 초기 해시 배열을 기록한 경우 업로드가 완료되고 확인 된 후 각 청크에 플래그를 설정할 수 있습니다. – fent

+0

그리고이 시스템에서는 사용자가 업로드를 시작하기 전에 파일의 해시를 보내야합니다. 두 사용자가 동일한 파일에서 동일한 청크를 업로드하는 상황에 절대로 있어서는 안됩니다. – fent