Akışlar
Node.js’te akışlar (Streams), büyük veri setlerini veya sürekli veri iletimini yönetmek için kullanılan güçlü bir yapıdır. Akışlar, veriyi küçük parçalara bölerek (chunks) işlemeyi sağlar, böylece belleğin aşırı yüklenmesini önler ve yüksek performanslı uygulamalar geliştirmeye olanak tanır. Dosya okuma/yazma, HTTP istekleri, veri işleme ve gerçek zamanlı uygulamalarda akışlar kritik bir rol oynar.
Node.js, akışları kullanarak asenkron ve non-blocking I/O modellerini destekler. Temel akış türleri şunlardır: Readable (okuma), Writable (yazma), Duplex (hem okuma hem yazma) ve Transform (veriyi dönüştürme). Bu ders, bu akış türlerinin nasıl uygulanacağını, backpressure yönetimini, hata yakalamayı ve performans optimizasyonunu kapsar. Ayrıca OOP prensipleri, veri yapıları ve algoritmalar ile birleşerek, sürdürülebilir ve ölçeklenebilir çözümler sunar.
Bu eğitim sonunda, okuyucular büyük dosyaları verimli bir şekilde işleyebilecek, gerçek zamanlı veri dönüşümleri uygulayabilecek ve Node.js projelerinde akışları güvenli ve etkili şekilde kullanabileceklerdir. Ayrıca hata ayıklama ve izleme yöntemleriyle akış tabanlı uygulamaları optimize etme becerisi kazanacaklardır.
Temel Örnek
textconst fs = require('fs');
// Readable Stream oluşturma
const readableStream = fs.createReadStream('girdi.txt', { encoding: 'utf8' });
// Writable Stream oluşturma
const writableStream = fs.createWriteStream('cikti.txt');
// Chunk bazlı veri işleme
readableStream.on('data', (chunk) => {
console.log('Okunan chunk boyutu:', chunk.length);
writableStream.write(chunk);
});
readableStream.on('end', () => {
console.log('Okuma tamamlandı');
writableStream.end();
});
readableStream.on('error', (err) => {
console.error('Readable Stream hatası:', err);
});
writableStream.on('finish', () => {
console.log('Yazma tamamlandı');
});
Bu örnekte, Readable Stream bir dosyadan veri okur ve Writable Stream aracılığıyla başka bir dosyaya yazar. 'data' olayı ile chunk bazlı işleme yapılır, böylece büyük dosyalar bellekte yük oluşturmaz. 'end' olayı okumanın tamamlandığını belirtirken, 'error' olayı hata yönetimini sağlar. Bu yaklaşım Node.js’in event-driven ve asenkron yapılarını kullanır. Akışlar modüler, yeniden kullanılabilir ve bakımı kolaydır, bu da özellikle büyük veri işleme veya gerçek zamanlı uygulamalarda önemlidir.
Pratik Örnek
textconst { Transform, pipeline } = require('stream');
const fs = require('fs');
// Transform Stream: metni büyük harfe çevirme
const upperCaseTransform = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk.toString().toUpperCase());
callback();
}
});
// Güvenli pipeline kullanımı
pipeline(
fs.createReadStream('girdi.txt'),
upperCaseTransform,
fs.createWriteStream('buyuk_harf_cikti.txt'),
(err) => {
if (err) {
console.error('Pipeline hatası:', err);
} else {
console.log('Dosya başarıyla büyük harfe çevrildi');
}
}
);
Bu gelişmiş örnek, Transform Stream ile veriyi gerçek zamanlı olarak dönüştürmeyi gösterir. Pipeline fonksiyonu, birden fazla akışı güvenli şekilde birleştirir ve hata yönetimini otomatik olarak yapar. Transform Stream, veri işleme mantığını kapsüller ve modülerliği artırır. Bu yöntem, log işleme, veri filtreleme veya dosya dönüşümleri gibi gerçek dünya senaryolarında yaygın olarak kullanılır ve performans, hata yönetimi ile ölçeklenebilirlik sağlar.
Akışlar ile çalışırken en iyi uygulamalar arasında pipeline kullanımı, Transform Stream ile mantığın kapsüllenmesi ve backpressure yönetimi yer alır. Yaygın hatalar, dosyaları komple belleğe yüklemek, 'error' olaylarını yok saymak veya Stream’leri yanlış kapatmaktır. Performans için buffer boyutu ayarlanmalı, asenkron işlemler kullanılmalı ve Stream’ler tekrar kullanılabilir şekilde tasarlanmalıdır. Dış verilerin doğrulanması ve bellek kullanımı izlenmesi, güvenli ve kararlı uygulamalar için önemlidir.
📊 Referans Tablosu
Node.js Element/Concept | Description | Usage Example |
---|---|---|
Readable Stream | Chunk bazlı veri okuma | fs.createReadStream('dosya.txt') |
Writable Stream | Chunk bazlı veri yazma | fs.createWriteStream('cikti.txt') |
Transform Stream | Veriyi gerçek zamanlı dönüştürme | new Transform({ transform(chunk, enc, cb){ cb(null, chunk.toString().toUpperCase()); } }) |
Duplex Stream | Hem okuma hem yazma | const duplex = new Duplex({ read(){}, write(chunk, enc, cb){ cb(); } }) |
Pipeline | Birden fazla Stream’i güvenli birleştirme | pipeline(readable, transform, writable, err=>{...}) |
Akışlar konusunda bu eğitimi tamamladıktan sonra, Readable, Writable, Transform ve Duplex akışlarını güvenli ve verimli bir şekilde kullanabilirsiniz. Pipeline ile akışları birleştirebilir, gerçek zamanlı veri işleme ve dosya dönüşümleri yapabilirsiniz. Sonraki konular olarak HTTP Streams, WebSocket akışları ve gelişmiş event pattern’leri çalışmak faydalı olacaktır. Pratik projeler ve Node.js topluluk kaynakları, öğrenmenizi pekiştirecek ve uygulamada ustalaşmanızı sağlayacaktır.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek