Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?

Cevap

Stream, veriyi tamamını belleğe almadan parça parça (chunk) işlemeyi sağlar. 5 GB'lık bir dosyayı fs.readFile ile okumak belleği doldurur; stream ile sabit ve küçük bellekle işlenir.

Türler

  • Readable: okunabilir kaynak (fs.createReadStream, HTTP isteği req)
  • Writable: yazılabilir hedef (fs.createWriteStream, HTTP yanıtı res)
  • Duplex: iki yönlü (TCP socket)
  • Transform: okurken veriyi dönüştüren duplex (zlib.createGzip, şifreleme)

Örnek: dosyayı sıkıştırarak HTTP yanıtı olarak göndermek

import { createReadStream } from "node:fs";
import { createGzip } from "node:zlib";
import { pipeline } from "node:stream/promises";

app.get("/rapor", async (req, res, next) => {
  res.setHeader("Content-Encoding", "gzip");
  try {
    await pipeline(createReadStream("./buyuk-rapor.csv"), createGzip(), res);
  } catch (err) {
    next(err);
  }
});

Backpressure

Okuma tarafı, yazma tarafından hızlıysa (ör. disk hızlı, istemcinin ağı yavaş) veriler bellekte birikir. Backpressure bu durumu yönetme mekanizmasıdır:

  • writable.write(chunk) iç tampon highWaterMark sınırını aşınca false döner.
  • Üretici bu durumda durmalı ve drain olayını beklemelidir.

pipe() ve pipeline() bunu otomatik yapar. Elle on("data") ile yazıp write() dönüşünü yok saymak bellek sızıntısına benzer şişmeye yol açar.

Neden pipeline?

a.pipe(b).pipe(c) zincirinde bir stream hata verirse diğerleri kapatılmaz ve hata yayılmaz. stream.pipeline hataları tek yerde toplar ve tüm stream'leri düzgünce kapatır.

Readable stream'ler async iterable'dır: for await (const chunk of stream) { ... } ile de tüketilebilir.

  1. cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?ZorNode.jsBackend
  2. Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?ZorNode.jsBackend
  3. Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?OrtaNode.jsBackend
  4. process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?OrtaNode.jsBackend
  5. Express.js'te middleware nedir ve nasıl çalışır?KolayNode.jsBackend
  6. CommonJS ile ES Modules (ESM) arasındaki fark nedir?KolayNode.jsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle