4

nodejs プロキシ サーバーを作成しているときに、データが他のソケット エンドに書き込まれる前に、データがプロキシに何度も到達する可能性があることに気付きました。データが入るたびに、socket.write(); を呼び出します。...

ただし、送信されるデータの順序が、送信の非同期性のために、書き込みをスケジュールした順序と同じであることが nodejs によって保証されているかどうかはわかりません。

この状況でのnodejsの動作を知っている人はいますか?

順序が保証されていない場合は、データが正常に送信されたコールバックを受信するまで、データをバッファリングする必要があります。

4

1 に答える 1

5

Node.js はシングル スレッドであり、一度に 1 つのことしか実行できません。順番に処理されるコールバックのキューがあります。詳細については、http: //howtonode.org/understanding-process-next-tickを参照してください。

データを受信するときに socket.write を呼び出している限り、データは順番に到着します。考えてみれば、これをしないとノードはウェブサーバーとして使えない。たとえば、単純なノード エクスプレス サイトでは、fs.readfile を使用してディスクから非同期的にファイルを読み取り、socket.write を使用してブラウザに返すことができます。順序が保証されていない場合、そのファイルが正しく返されない可能性があります。

ノード 0.8.14 のドキュメントから: http://nodemanual.org/latest/nodejs_ref_guide/net.html#net.Socket.write

データ全体がカーネル バッファに正常にフラッシュされた場合は true を返します。データの全部または一部がユーザー メモリのキューに入れられた場合は、false を返します。'drain' は、バッファーが再び解放されたときに発行されます。

net.Socket には、socket.write() が常に機能するというプロパティがあります。これは、ユーザーがすぐに起動して実行できるようにするためです。コンピュータは、ソケットに書き込まれるデータの量に常に対応できるとは限りません。ネットワーク接続が遅すぎる可能性があります。Node.js は、ソケットに書き込まれたデータを内部的にキューに入れ、可能な限りネットワーク経由で送信します。(内部的には、ソケットのファイル記述子で書き込み可能かどうかをポーリングしています。)

于 2012-12-13T10:50:03.310 に答える