バックプレッシャーとパイプ処理
pipeTo と pipeThrough でデータの流れを制御します。
「バックプレッシャーとパイプ処理」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。
バックプレッシャーの問題
プロデューサーがコンシューマーの処理速度を上回る速さでデータを生成すると、メモリがいっぱいになります。バックプレッシャーとは、処理の遅いコンシューマーが処理の速いプロデューサーに速度を落とすよう伝える仕組みです。
WritableStream
WritableStreamは、チャンクを書き込む宛先です。そのシンクメソッドであるwrite(chunk)は非同期にでき、次のチャンクを受け取る準備ができたことを通知できます。
const sink = new WritableStream({
write(chunk) {
console.log("writing", chunk);
}
});Writerの取得
getWriter()は書き込み可能ストリームをロックし、write()、close()、readyプロミスを持つWriterを返します。
const writer = sink.getWriter();
await writer.write("hello");
await writer.close();readyシグナル
書き込む前にwriter.readyをawaitします。ストリームがさらにデータを受け入れられる状態になると解決されます。これが、実際にバックプレッシャーが働いている状態です。
await writer.ready;
await writer.write(chunk);pipeTo
readable.pipeTo(writable)はソースと宛先を接続し、バックプレッシャーを自動的に管理します。パイピングが完了すると解決されるプロミスを返します。
await readableStream.pipeTo(writableStream);
console.log("done piping");pipeThrough
pipeThrough(transform)はソースとシンクの間に変換処理を挿入し、変換後のReadableStreamを返します。いくつかを連結してパイプラインを構築できます。
sourceStream
.pipeThrough(new TextDecoderStream())
.pipeThrough(parser)
.pipeTo(consumer);ハイウォーターマーク
キューイング戦略のhighWaterMarkは、バックプレッシャーが発生するまでにキューへ入れられるチャンク数を設定します。スループットとメモリ使用量のバランスが取れるよう調整します。
new ReadableStream(source, new CountQueuingStrategy({ highWaterMark: 4 }));desiredSize
コントローラーのdesiredSizeは、キューにどれだけ空きがあるかをプロデューサーに伝えます。0以下になったら、エンキューを停止します。
pull(controller) {
while (controller.desiredSize > 0) {
controller.enqueue(nextChunk());
}
}パイプの中断
{ signal }をpipeToに渡すと、AbortControllerを使ってパイプライン全体を中断できます。
const ctrl = new AbortController();
readable.pipeTo(writable, { signal: ctrl.signal });
ctrl.abort();パイプのオプション
pipeToでは、preventClose、preventAbort、preventCancelを指定して、両端の間でエラーや完了をどのように伝播させるかを制御できます。
readable.pipeTo(writable, { preventClose: true });完全なパイプライン
すべてを組み合わせると、バイト列を取得し、デコードし、変換してからシンクに書き込む処理を、自動的なフロー制御ですべて実行できます。
const res = await fetch("/data");
await res.body
.pipeThrough(new TextDecoderStream())
.pipeThrough(lineSplitter)
.pipeTo(uiSink);クイックチェック
バックプレッシャーをテストします。
復習:バックプレッシャーとパイピング
WritableStreamとWriterについて学び、バックプレッシャーのためにreadyをawaitし、pipeToとpipeThroughでストリームを接続し、highWaterMarkを調整してdesiredSizeを確認し、パイプラインを中断しました。これでStreams APIの学習は完了です。
よくある質問
「バックプレッシャーとパイプ処理」レッスンは無料ですか?
はい。「バックプレッシャーとパイプ処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。
「バックプレッシャーとパイプ処理」で何を学びますか?
pipeTo と pipeThrough でデータの流れを制御します。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
JavaScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「バックプレッシャーとパイプ処理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJavaScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Readable Streams
- fetch レスポンスのストリーミング
- Transform Streams
- バックプレッシャーとパイプ処理