NPMライブラリ:through高速双方向ストリームの作成


NPMライブラリは、毎日2分、人気のあるNPMライブラリを知っています.
ながれ
ダウンロードなどの機能をするとき、私たちはよくデータストリームモジュール(stream)を使用します.なぜなら、大きなファイルダウンロードシーンでは、fs.readFile()インタフェースを使用してファイルをすべてメモリに読み込み、クライアントに返すと、ファイル200 Mのようなメモリを爆発させやすく、同時に100人がダウンロードしている場合、サービスは10 Gメモリを消費する必要があります.
streamを使用すると、ファイルをすべてメモリに読み込むのではなく、メモリに「水道管」を構築するだけなので、メモリにデータがあまり蓄積されません.
ctx.body = fs.createReadStream('filename.ext');

上記のコードでは、fs.createReadStream()メソッドを使用して読み取り可能なストリームを作成し、Koaはデータストリームを直接読み取り、クライアントに返します.
にほうこうりゅう
1つのストリームが同時に読み取り可能で書き込み可能である場合、これは双方向のストリームです.「水道管」は双方向の流れを説明するのに適していません.私たちは「電話線」で説明します.あなたの言うこと(データを書く)は相手が聞こえる(データを読む)と同時に、相手の話(データを書く)も聞こえます(データを読む).
双方向ストリームを使用すると、データベースがシーンをエクスポートするなど、複雑な問題を解決することが多い.データベースのデータが大きいので、ノードを一気に読むことはできません.jsメモリでは、書き込み専用ストリームを作成し、データベースからデータを1つずつ読み出して書き込み専用ストリームを呼び出し、データをディスクに書き込み、すべてのデータをディスクにエクスポートした後、上記を参照して読み取り専用ストリームを作成し、クライアントにファイルを返すことができます.しかし、このように問題があります.
  • ディスクサイズには
  • が必要です.
  • データベースがディスクにエクスポートされる間、クライアントは情報を受け取ることができず、ブラウザが
  • にタイムアウトする可能性があります.
  • システム性能を無駄に消費し、ディスクIO
  • を浪費する
    次に、双方向ストリームを使用してこの問題を解決します.
    through
    throughを使用すると、streamモジュールを呼び出して双方向ストリームを作成するよりも、throughがリソース回収などのメカニズムをカプセル化しているため、双方向ストリームを迅速に作成できます.
    const through = require('through');
    
    // ...
    
    const stream = through();
    ctx.body = stream;
    
    Order.find()
      .cursor()
      .eachAsync(async(order)=>{
        stream.write(order.toJSON());
      })
      .then(()=>{
        stream.end();
      });

    上記のコードでは、まず双方向ストリームを作成し、Koaに返し、Mongooseモデルで例を挙げてデータベースをクエリーし、クエリーカーソル(cursor)を使用してストリームにデータを1つずつ書きます.ストリームの反対側では、Koaはデータを1つずつ読み出してクライアントに返すことができます.
    参考資料
    https://github.com/dominictar...
    https://nodejs.org/api/stream...
    公衆番号へようこそ:梁興臣
    毎日1つのNPMライブラリを知っていて、1年後にノードになります.jsの達人