Node.jsストリーム、特に概念的にどのように機能するかについて質問があります。
ストリームの使用方法に関するドキュメントが不足しているわけではありません。しかし、ストリームがデータレベルでどのように機能するかを見つけるのに苦労しました。
Web通信(HTTP)についての私の限られた理解は、データの完全な「パッケージ」が前後に送信されるということです。個人が会社のカタログを注文するのと同様に、クライアントはGET(カタログ)要求をサーバーに送信し、サーバーはカタログで応答します。ブラウザはカタログのページではなく、本全体を受け取ります。
ノードストリームはおそらくマルチパートメッセージですか?
私はRESTモデルが好きです-特にそれがステートレスであるということです。ブラウザとサーバー間のすべての相互作用は完全に自己完結型で十分です。したがって、ノードストリームはRESTfulではありませんか?ある開発者は、接続を開いたままにするソケットパイプとの類似性について言及しました。カタログの注文例に戻ると、これは「でも待ってください!もっとあります!」という行のあるインフォマーシャルのようなものでしょうか。完全に含まれているカタログの代わりに?
ストリームの大部分は、受信者の「ダウンストリーム」が「一時停止」や「続行」などのメッセージをアップストリームに送信する機能です。これらのメッセージは何で構成されていますか?彼らはPOSTですか?
最後に、Nodeがどのように機能するかについての私の限られた視覚的理解には、このイベントループが含まれます。関数はスレッドプールとは別のスレッドに配置でき、イベントループが続行されます。しかし、データのストリームを送信すると、ストリームが完了するまでイベントループが占有されたままになる(つまり停止される)べきではありませんか?また、ダウンストリームからの「一時停止」リクエストを監視する方法もありますか?nイベントループはストリームをプールから別のスレッドに配置し、「一時停止」リクエストが発生したときに、関連するスレッドを取得して一時停止しますか?
node.jsのドキュメントを読み、nodeschoolチュートリアルを完了し、herokuアプリを作成し、2冊の本(本物、自己完結型、本、以前に話されたカタログのようなもので、ノードストリームのようなものではない可能性が高い)を購入し、いくつかの「ノード」に質問しました。コードブートキャンプのインストラクター-全員がストリームの使用方法について話しますが、実際に何が起こっているかについては誰も話しません。
おそらく、これらがどのように機能するかを説明する優れたリソースに出くわしたことがありますか?おそらく、CS以外の心の良い擬人化のアナロジーですか?
最初に注意することは、node.jsストリームはHTTPリクエストに限定されないということです。HTTPリクエスト/ネットワークリソースは、node.jsのストリームの一例にすぎません。
ストリームは、小さなチャンクで処理できるすべてのものに役立ちます。それらを使用すると、RAMに収まる小さなチャンクで潜在的に巨大なリソースをより簡単に処理できます。
ファイル(サイズが数ギガバイト)があり、すべて小文字を大文字に変換して、結果を別のファイルに書き込みたいとします。素朴なアプローチでは、fs.readFile
(簡潔にするためにエラー処理を省略)を使用してファイル全体を読み取ります。
fs.readFile('my_huge_file', function (err, data) {
var convertedData = data.toString().toUpperCase();
fs.writeFile('my_converted_file', convertedData);
});
残念ながら、このアプローチでは、ファイルを処理する前にファイル全体を保存する必要があるため、RAMを簡単に圧倒してしまいます。また、ファイルが読み取られるのを待つ貴重な時間を無駄にします。ファイルを小さなチャンクで処理するのは意味がありませんか?ハードディスクが残りのデータを提供するのを待っている間に、最初のバイトを取得するとすぐに処理を開始できます。
var readStream = fs.createReadStream('my_huge_file');
var writeStream = fs.createWriteStream('my_converted_file');
readStream.on('data', function (chunk) {
var convertedChunk = chunk.toString().toUpperCase();
writeStream.write(convertedChunk);
});
readStream.on('end', function () {
writeStream.end();
});
このアプローチははるかに優れています。
ストリームを開くと、node.jsがファイルを開き、ファイルからの読み取りを開始します。オペレーティングシステムがファイルを読み取っているスレッドにバイトを渡すと、アプリケーションに渡されます。
HTTPストリームに戻る:
HTTPストリームの一時停止について:これはHTTPレベルでは実行されませんが、はるかに低くなります。ストリームを一時停止すると、node.jsは基になるTCPソケットからの読み取りを停止します。そのとき何が起こっているかはカーネル次第です。それでも受信データをバッファリングする可能性があるため、現在の作業が終了したらすぐに使用できます。また、データの送信を一時停止する必要があることをTCPレベルで送信者に通知する場合もあります。アプリケーションはそれに対処する必要はありません。それは彼らの仕事ではありません。実際、送信者アプリケーションは、おそらくあなたがもはや積極的に読んでいないことに気づいていません!
つまり、基本的には、データが利用可能になり次第提供されることですが、リソースを圧倒することはありません。基礎となるハードワークは、オペレーティングシステム(たとえば、のいずれかによって行われているnet
、fs
、http
)、または(例えば、使用しているストリームの作者でzlib
あるTransform
ストリームと、通常は上にボルトで固定fs
またはnet
)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加