私の最初のnode.jsプロジェクトでは、いくつかのmjpeg出力のプロキシを作成しています。現在、一部のクライアントはサーバーが取得している速度でストリームを読み取ることができないため、フレームをドロップして追いつくようにしています。私は現在drain
、オブジェクトのイベントをhttp.ServerResponse
多かれ少なかれ以下のように使用していますが、が非常にdrain
多く呼び出されるため、より良い/より軽量なアプローチがあるかどうか疑問に思っています(書き込み可能なストリームのドキュメントでは見つけることができませんでした) )。
httpServer.on('request',function(request,response){
//skipped setting some headers etc.
res.socket.on('drain', function(){
res.drained = true;
res.draincounter = 0;
});
//followed by some unconditional first write (set drained to false first)
res.drained = false;
res.write(someData);
};
これで、クライアントへのフレームの書き込みは次のようになります。
writeFrame = function(res,frame){
if(res.drained){
//nothing in queue, ready for new data
//first set drained to false
res.drained = false;
//and feed it more data
res.write(frame, 'binary');
} else if(res.draincounter > maxDroppedFrames){
//to many dropped frames in a row, disconnect
res.end();
} else {
res.draincounter++;
}
}
しかし、これはカスタムプロパティを使用し、ドレインイベントへの多くの呼び出しを使用します(これは問題ないかもしれませんが、私の限られた経験ではうまくいきません)。一言で言えば、私の質問はこれです:
Writable Stream
の書き込みバッファが空であることを検出するためのより効果的な方法はありますか?
編集:シャットダウンしてしばらく休止した後、ノード0.10.18でこのプロジェクトを再起動した後、drain
イベントが発生しなくなったため、何かひどく間違っています(少なくとも上記の方法ではありません)。今のところres.socket.bufferSize
、mjpegフレームを書き込むかどうかを決定するために、特定のマークを超えているかどうかを確認しますが、draincounter
それでも機能します。問題はクライアントの速度に関するすべてのデータを書き込むことではなく、クライアントの速度がソースストリームよりも遅い場合にデータをドロップすることでpipe()
あるため、コメントのストリームドキュメントから提唱されているか、私の場合は解決策ではありません。
背圧でのデータのドロップを処理する適切な方法について誰かに教えてもらえますか(そうでない場合)?