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ğireq) - 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ç tamponhighWaterMarksınırını aşıncafalsedöner.- Üretici bu durumda durmalı ve
drainolayı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.
İlgili Node.js soruları
- cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?
- Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?
- process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?
- Express.js'te middleware nedir ve nasıl çalışır?
- CommonJS ile ES Modules (ESM) arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.