2012-01-17 9 views
3

node.jsのファイルへのアクセスを調整するベストプラクティスは何ですか?nodejsのファイルシステムアクティビティの調整

私は、再開可能な非常に大きなファイル(10sGB)用のHTTPベースのファイルアップローダを作成しようとしています。私は最高のアプローチが同じファイルを同時にアップロードしようとしている2人を処理することを理解しようとしています...私はnode.jsの複数のコピーhttpサーバはロードバランサの背後で実行されています。つまり、重複したアップロードをキャッチすることは、コードそのものに依存することはできません。

たとえば、open()呼び出しに正しいフラグを渡してアトミックな作成を強制することで、ファイルを作成できます。デフォルトのnode.jsオープンファイルがアトミックであるかどうかは不明です。

私は思ったが、本当に追求したくない、複数のユーザーであるかどうかを知るために...この状態を追跡するためにアトミックトランザクションをサポート非同期ドライバで

答えて

0

node.jsのいくつかの同じことについて不平を言う人への返答の下、HackerNewsでこれが見つかりました。それを完全にするために私はここに入れます。これにより、少なくとも私が望むようにnode.jsのファイル書き込みをロックすることができます。

IsaacSchlueter 4時間前|リンク

オープンフラグを として渡すと、O_EXCLでファイルを開くことができます。 (あなたはそれらをrequire( "定数")で見つけることができ、 はバイナリORで結合する必要があります)。これは文書化されていません。そのはず。また、 は、おそらくよりクリーンな方法で露出されるべきです。残りのほとんどの部分は、洗練された洗練されたAPIであることをあなたが記述しているのは です。 境界はこの時点で明確に定義されています。おそらく は、別の組み込みモジュールをこの時点で追加することも、 を大幅に拡張することもできません。(私はseek()を劇的に考えていません)、

0

をデータベースを使用している別のオプションは、同じファイルをアップロードすると、何らかの形でファイルを識別する必要があります。ハッシングはこれに最適です。まず、クライアント側でファイル全体をハッシュして識別します。サーバに同じハッシュを持つファイルが既に存在する場合、ファイルのハッシュを伝え、ファイルがすでにアップロードされているか、または現在アップロードされています。

これはhttpファイルサーバーなので、ユーザーはブラウザからファイルをアップロードする必要があります。 File Reader APIを使用して、ブラウザでファイルの内容を取得できます。残念ながら今のところはthis isn't widely supportedです。他のブラウザでも動作させるには、フラッシュのようなものを使用する必要があります。

ファイルをファイルリーダーでメモリにストリーミングするときに、ファイルリーダーでそれを分割し、チャンクをハッシュしたいと思うでしょう。次に、サーバーにファイルのハッシュ・チャンクをすべて送信します。クライアントがハッシュを1つ送信して別のファイル全体をアップロードできるため、ファイル全体を内容ではなく、チャンクに分割して個々のチャンクをハッシュすることが重要です。

ハッシュを受信して​​他のファイルのハッシュと比較した後、他の誰かが現在同じファイルをアップロードしていることが判明した場合、サーバーはそのファイルのどのチャンクをアップロードするかを決定します。次に、サーバは、アップロードするクライアントに、それからどのチャンクが必要かを指示し、クライアントは、対応するチャンクをアップロードします。

各チャンクのアップロードが完了すると、サーバー上で再ハッシュされ、元のハッシュ配列と比較され、ユーザーが正しいファイルをアップロードしていることを確認します。

+0

私はあなたが説明したようにほとんど正確に実装していることを明確にする必要があります。誰かが現在同じファイルをアップロードしていると判明した場合、サーバーはどのユーザーがどのチャンクをアップロードするかを決定します。 "これをnode.jsに実装するにはどうすればいいですか(詳細)?チャンクが現在のアップローダによって放棄されたかどうかをサーバーはどのように区別しますか? 2つのチャンクが同時にアップロードされた場合、どのように受け入れられ、他のチャンクが拒否される(何らかのアトミック操作)ことを保証するにはどうすればよいですか? – Cyclone

+0

1MBのようなチャンクサイズを選んで、アップロードしたユーザーの間にチャンクを配布します。通常、最初のユーザーは最初のチャンクをアップロードし、2番目のユーザーはファイルの後半をアップロードします。 nユーザーが同じファイルをアップロードすると、残りのチャンクの1/nを現在のアップローダから取り出し、新しいユーザーに与えます。各クライアントが送信しなければならない最初の配列のハッシュを記録しておけば、アップロードが完了して検証されたときに各チャンクにフラグを設定できます。 – fent

+0

このシステムでは、ユーザーはアップロードを開始する前にファイルのハッシュを送信する必要があります。 2人のユーザーが同じファイルから同じチャンクをアップロードしている状況にあってはなりません。 – fent