Node.jsストリームはどのように機能しますか?

ZAR

Node.jsストリーム、特に概念的にどのように機能するかについて質問があります。

ストリームの使用方法に関するドキュメントが不足しているわけではありません。しかし、ストリームがデータレベルでどのように機能するかを見つけるのに苦労しました。

Web通信(HTTP)についての私の限られた理解は、データの完全な「パッケージ」が前後に送信されるということです。個人が会社のカタログを注文するのと同様に、クライアントはGET(カタログ)要求をサーバーに送信し、サーバーはカタログで応答します。ブラウザはカタログのページではなく、本全体を受け取ります。

ノードストリームはおそらくマルチパートメッセージですか?

私はRESTモデルが好きです-特にそれがステートレスであるということです。ブラウザとサーバー間のすべての相互作用は完全に自己完結型で十分です。したがって、ノードストリームはRESTfulではありませんか?ある開発者は、接続を開いたままにするソケットパイプとの類似性について言及しました。カタログの注文例に戻ると、これは「でも待ってください!もっとあります!」という行のあるインフォマーシャルのようなものでしょうか。完全に含まれているカタログの代わりに?

ストリームの大部分は、受信者の「ダウンストリーム」が「一時停止」や「続行」などのメッセージをアップストリームに送信する機能です。これらのメッセージは何で構成されていますか?彼らはPOSTですか?

最後に、Nodeがどのように機能するかについての私の限られた視覚的理解には、このイベントループが含まれます。関数はスレッドプールとは別のスレッドに配置でき、イベントループが続行されます。しかし、データのストリームを送信すると、ストリームが完了するまでイベントループが占有されたままになる(つまり停止される)べきではありませんか?また、ダウンストリームからの「一時停止」リクエストを監視する方法もありますか?nイベントループはストリームをプールから別のスレッドに配置し、「一時停止」リクエストが発生したときに、関連するスレッドを取得して一時停止しますか?

node.jsのドキュメントを読み、nodeschoolチュートリアルを完了し、herokuアプリを作成し、2冊の本(本物、自己完結型、本、以前に話されたカタログのようなもので、ノードストリームのようなものではない可能性が高い)を購入し、いくつかの「ノード」に質問しました。コードブートキャンプのインストラクター-全員がストリームの使用方法について話しますが、実際に何が起こっているかについては誰も話しません。

おそらく、これらがどのように機能するかを説明する優れたリソースに出くわしたことがありますか?おそらく、CS以外の心の良い擬人化のアナロジーですか?

TimWolla

最初に注意することは、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();
});

このアプローチははるかに優れています。

  1. RAMに簡単に収まるデータの小さな部分のみを扱います。
  2. 最初のバイトが到着したら処理を開始し、何もせずに待機する時間を無駄にしません。

ストリームを開くと、node.jsがファイルを開き、ファイルからの読み取りを開始します。オペレーティングシステムがファイルを読み取っているスレッドにバイトを渡すと、アプリケーションに渡されます。


HTTPストリームに戻る:

  1. 最初の問題はここでも有効です。攻撃者が大量のデータを送信してRAMを圧倒し、サービスを停止(DoS)する可能性があります。
  2. ただし、この場合、2番目の問題はさらに重要です。ネットワークが非常に遅い場合があり(スマートフォンを考えてください)、すべてがクライアントから送信されるまでに長い時間がかかる場合があります。ストリームを使用することで、要求の処理を開始し、応答時間を短縮できます。

HTTPストリームの一時停止について:これはHTTPレベルでは実行されませんが、はるかに低くなります。ストリームを一時停止すると、node.jsは基になるTCPソケットからの読み取りを停止します。そのとき何が起こっているかはカーネル次第です。それでも受信データをバッファリングする可能性があるため、現在の作業が終了したらすぐに使用できます。また、データの送信を一時停止する必要があることをTCPレベルで送信者に通知する場合もありますアプリケーションはそれに対処する必要はありません。それは彼らの仕事ではありません。実際、送信者アプリケーションは、おそらくあなたがもはや積極的に読んでいないことに気づいていません!

つまり、基本的には、データが利用可能になり次第提供されることですが、リソースを圧倒することはありません。基礎となるハードワークは、オペレーティングシステム(たとえば、のいずれかによって行われているnetfshttp)、または(例えば、使用しているストリームの作者でzlibあるTransformストリームと、通常は上にボルトで固定fsまたはnet)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

NodeクラスのリンクリストはC ++でどのように機能しますか?

分類Dev

pipe(Node.jsのストリーム)とbl(BufferList)はどのように連携しますか?

分類Dev

node.jsクラスタリングはどのように機能しますか?

分類Dev

Node.js + Expressアプリケーションで並行性はどのように機能しますか?

分類Dev

Node.js / Express.js-app.routerはどのように機能しますか?

分類Dev

node.js-Busboyは実際にどのように機能しますか?

分類Dev

node.jsのrequire()はどのように機能しますか?

分類Dev

複数の同時リクエストがあるNode.jsサーバー、どのように機能しますか?

分類Dev

Node.jsはどのようにスクリプトをメモリにロードしますか?

分類Dev

node.jsの構成可能なロガーはどのように機能しますか?

分類Dev

Node.jsでreactorパターンはどのように機能しますか?

分類Dev

Node.jsサーバーはどのようにリクエストを処理しますか?

分類Dev

Node.jsはライブラリアサーションを「すべき」ですが、どのように機能しますか?

分類Dev

node / javascript()()構文-正確にはどのように機能しますか?

分類Dev

DjangoとNode–どのように機能しますか?

分類Dev

node.jsリクエストライブラリのタイムアウト時にコールバックをどのように設定しますか?

分類Dev

Node Buffer.lastIndexOf byteOffsetはどのように機能しますか?

分類Dev

Nodeのrequireパスがどのように機能するかについての明確なリストを持っている人はいますか?

分類Dev

pdflatex子プロセスを使用してPDFをNode.jsのストリームとして取得するにはどうすればよいですか?

分類Dev

node.js twitを使用してユーザーのTwitterストリームを取得するにはどうすればよいですか?

分類Dev

node.js httpモジュールhttp.createServerどのように機能しますか?

分類Dev

Node.jsは着信リクエストをどのように処理しますか?

分類Dev

このコールバック呼び出しは、mongo.find呼び出しを使用してNode.jsでどのように機能しますか

分類Dev

node.jsでストリームを作成するにはどうすればよいですか?

分類Dev

node.jsのファイルストリームで何かをユニットテストするにはどうすればよいですか?

分類Dev

Node.jsで「パスワードを忘れた/リセット」機能を適切に実装するにはどうすればよいですか?(ワンタイムトークンを使用)

分類Dev

node.jsプロジェクトテンプレートまたは拡張機能をVisualStudioに追加するにはどうすればよいですか?

分類Dev

Node.jsまたはPHPでMySQLデータベースの変更をリアルタイムで聞くにはどうすればよいですか

分類Dev

Node.jsを使用してJSONストリームをファイルに書き込むにはどうすればよいですか?

Related 関連記事

  1. 1

    NodeクラスのリンクリストはC ++でどのように機能しますか?

  2. 2

    pipe(Node.jsのストリーム)とbl(BufferList)はどのように連携しますか?

  3. 3

    node.jsクラスタリングはどのように機能しますか?

  4. 4

    Node.js + Expressアプリケーションで並行性はどのように機能しますか?

  5. 5

    Node.js / Express.js-app.routerはどのように機能しますか?

  6. 6

    node.js-Busboyは実際にどのように機能しますか?

  7. 7

    node.jsのrequire()はどのように機能しますか?

  8. 8

    複数の同時リクエストがあるNode.jsサーバー、どのように機能しますか?

  9. 9

    Node.jsはどのようにスクリプトをメモリにロードしますか?

  10. 10

    node.jsの構成可能なロガーはどのように機能しますか?

  11. 11

    Node.jsでreactorパターンはどのように機能しますか?

  12. 12

    Node.jsサーバーはどのようにリクエストを処理しますか?

  13. 13

    Node.jsはライブラリアサーションを「すべき」ですが、どのように機能しますか?

  14. 14

    node / javascript()()構文-正確にはどのように機能しますか?

  15. 15

    DjangoとNode–どのように機能しますか?

  16. 16

    node.jsリクエストライブラリのタイムアウト時にコールバックをどのように設定しますか?

  17. 17

    Node Buffer.lastIndexOf byteOffsetはどのように機能しますか?

  18. 18

    Nodeのrequireパスがどのように機能するかについての明確なリストを持っている人はいますか?

  19. 19

    pdflatex子プロセスを使用してPDFをNode.jsのストリームとして取得するにはどうすればよいですか?

  20. 20

    node.js twitを使用してユーザーのTwitterストリームを取得するにはどうすればよいですか?

  21. 21

    node.js httpモジュールhttp.createServerどのように機能しますか?

  22. 22

    Node.jsは着信リクエストをどのように処理しますか?

  23. 23

    このコールバック呼び出しは、mongo.find呼び出しを使用してNode.jsでどのように機能しますか

  24. 24

    node.jsでストリームを作成するにはどうすればよいですか?

  25. 25

    node.jsのファイルストリームで何かをユニットテストするにはどうすればよいですか?

  26. 26

    Node.jsで「パスワードを忘れた/リセット」機能を適切に実装するにはどうすればよいですか?(ワンタイムトークンを使用)

  27. 27

    node.jsプロジェクトテンプレートまたは拡張機能をVisualStudioに追加するにはどうすればよいですか?

  28. 28

    Node.jsまたはPHPでMySQLデータベースの変更をリアルタイムで聞くにはどうすればよいですか

  29. 29

    Node.jsを使用してJSONストリームをファイルに書き込むにはどうすればよいですか?

ホットタグ

アーカイブ