Çoklu Veri Akışı İşleme için Node.js Stream ()

Çoklu Veri Akışı İşleme için Node.js Stream ()

Nodejs Stream, veri işleme işlemini optimize etmek için kullanılan bir I/O aracıdır Verileri küçük parçalara bölerek sürekli olarak okuyup yazma işlemini sağlayarak büyük dosyaların ve veritabanı kayıtlarının işlenmesine olanak tanır Dört temel Stream türü vardır: Readable, Writable, Duplex ve Transform Her biri farklı özellikler sunarak veri işleme yöntemleri hakkında bilgi verir Readable Stream, veri akışını okumak için kullanılır ve pause ve resume yöntemleriyle kontrol edilebilir Piped Stream özelliği, Readable Stream ve Writable Stream'in bağlanmasıyla veri akışı işleme işleminin gerçekleştirilmesinde kullanılır Bu yöntem, Nodejs Stream kullanarak veri işleme işlemini daha verimli ve hızlı hale getirir Nodejs Stream, web sunucuları gibi çoklu gereksinimli uygulamalarda da kullanılabilir

Çoklu Veri Akışı İşleme için Node.js Stream ()

Node.js Stream, büyük miktarda veriyi işleyerek bellek kullanımını azaltmaya yardımcı olan bir I/O aracıdır. Veri akışı işleme yöntemi olarak kullanılır. Node.js Stream, büyük miktarda veri akışını işlemek için bellek kullanımını minimize ederek verimliliği artırır.

Stream, sıralı veri akışıdır. Akış, verileri küçük parçalara bölerek sürekli olarak okuyup yazmayı sağlar. Bu sayede büyük dosyalar ve veritabanı kayıtları gibi veri boyutu büyük veri kaynakları işlenebilir. Dört temel Stream türü vardır: Readable, Writable, Duplex ve Transform. Her tür, farklı veri işleme yöntemleri ve özellikleri sunar.

Node.js Stream kullanarak, uygulamalar daha optimize edilmiş bir şekilde gerçekleştirilebilir. Web sunucusu, dosya okuma/yazma işlemleri, TCP soket işlemleri ve daha birçok uygulama, Node.js Stream kullanarak çok daha verimli ve hızlı bir şekilde gerçekleştirilebilir.


Node.js Stream Nedir?

Node.js Stream, Node.js'in güçlü bir aracıdır. Büyük miktarda veriyi işleyerek bellek kullanımını azaltmaya yardımcı olur. Stream, veri akışının işlenmesi sırasında tüm verileri bir anda yüklemek yerine parçalar halinde okur. Bu, bellek kullanımını azaltmanın yanında işlem hızını da arttırır.

Node.js Stream, veri akışını gerçek zamanlı olarak işlemek için kullanılır. Bu özellik, verilerin işlenmesini hızlandırmak için özellikle önemlidir. Stream, birçok farklı veri şekliyle uyumlu olduğu için çevik bir işlem aracı olarak kullanılabilir. Aynı zamanda, Node.js Stream'in birden çok kaynaktan veri toplama ve işleme özelliği sayesinde birden çok veri kaynağından gelen verileri toplama ve işleme özelliği de mevcuttur. Bu özellik sayesinde Node.js Stream, web sunucuları gibi çok gereksinimli uygulamalarda kullanılabilmektedir.

  • Stream ile birlikte, işlem performansı ve bellek kullanımı optimize edilebilir.
  • Stream, verileri parça parça işleyerek daha hızlı bir işlem yapılmasına olanak sağlar.
  • Hem çevik hem de ölçeklenebilir olan Node.js Stream, birden çok kaynaktan veri toplama ve işleme özelliği sayesinde çok gereksinimli uygulamalarda kullanılabilir.

Stream Türleri

Node.js Stream, büyük miktarda veriyi daha verimli bir şekilde işlemek için kullanılan bir I/O aracıdır. Bu amaçla Stream, okunabilir, yazılabilir, çift yönlü ve dönüştürülebilir olmak üzere farklı türleri içerir.

Readable Stream: Bu tür, veri akışını okumak için kullanılır ve pause() ve resume() yöntemleriyle kontrol edilebilir. Ayrıca, veri akışında okuma işlemi başlayana kadar bekleyen 'readable' olayı da içerir. Bu tip Stream, bir önceki Stream'den aldığı verileri pipe() yöntemiyle Writable Stream'e bağlayarak verilerin akışını başlatır.

Writable Stream: Bu tür, veri akışını yazmak için kullanılır ve end() yöntemiyle sonlandırılır. Verilerin hafızada tamponlanması ve drain() yöntemiyle tamponun boşaltılması kontrol edilebilir.

Duplex Stream: Hem okuma hem de yazma işlemleri için kullanılabilir. Okuma ya da yazma işlemi sırasında veri akışı, veri akışının diğer tarafında da devam eder.

Transform Stream: Bu tür, okunan verileri dönüştürmek için kullanılır ve kaynak veriyi değiştirmeden akışı değiştirebilir. Veri dönüşümünün yanı sıra, herhangi bir veri işleme işlemi de gerçekleştirebilir.

Bu dört farklı tür, Node.js Stream kullanarak birçok uygulamada çoklu veri akışı işleme yöntemi olarak kullanılabilir.


Readable Stream

Node.js Stream'un en temel türü olan Readable Stream, veri akışını okumak için kullanılır. Veri akışının duraklatılması, yeniden başlatılması ve okunabilirlik durumunun kontrolü için pause() ve resume() yöntemleri kullanılabilir.

Readable Stream'ler, Piped Stream özelliği sayesinde Writable Stream'lerle bağlanarak verilerin akışını başlatır. Bu işlemin gerçekleştirilmesi için pipe() yöntemi kullanılır. Ayrıca, veri okuma işlemi sırasında data, end ve error olayları gerçekleşebilir.

Bu tür veri akışı yöntemi, büyük verilerin bellek kullanımını azaltarak daha optimize bir işlem sağlar. Özellikle, dosya okuma veya HTTP isteklerinde kullanılan bu yöntemle, hafızada bir tampon oluşturmadan veriler okunabilir.

Readable Stream, Node.js Stream'un dört farklı türünden sadece biridir. Diğer türler hakkında bilgi sahibi olmak, daha kapsamlı uygulamaların geliştirilmesine yardımcı olabilir.


Piped Streams

Readable Stream, büyük miktarda veri akışı işleme ihtiyacı olan uygulamalarda kullanılmaktadır. Bu nedenle, bazen bir Readable Stream ile yazdırılacak bir veri akışı elde edilir. Bu durumlarda, Veri akışını başlatmak için pipe () yöntemi kullanılır. Readable Stream, pipe () yöntemiyle Writable Stream'e bağlanarak verilerin akışını başlatır.

Bu yöntem, Node.js Stream kullanarak veri akışı işleme için oldukça verimlidir. Özellikle büyük veri akışlarında, pipe () yöntemi sayesinde veri akışı bellekte tamponlanmadan akar ve anında işlenebilir. Bu, hem bellek kullanımını azaltır hem de uygulama performansını artırır.

Aşağıdaki örnek, bir dosya okuma işleminden sonra verilerin veri.txt dosyasına yazdırılmasını göstermektedir:

const fs = require('fs');const readable = fs.createReadStream('./veri.txt');const writable = fs.createWriteStream('./yeni_veri.txt');readable.pipe(writable);

Yukarıdaki örnekte, önce bir Readable Stream oluşturulur ve ./veri.txt dosyasından veri akışı alınır. Daha sonra, bir Writable Stream oluşturulur ve ./yeni_veri.txt dosyasına elde edilen veri akışı yazdırılır. Son olarak, pipe () yöntemi kullanılarak Readable Stream'in Writable Stream'e bağlanarak veri akışı başlatılır.


Stream Olayları

Stream olayları, veri akışı sırasında gerçekleşen önemli durumlardır. Okunan verilerin akışını kontrol ederler ve birçok yöntem ve özellik içerirler. İlk olarak, "data" olayı, herhangi bir veri okuma işlemi gerçekleştirildiğinde tetiklenir. Bu olay, okunan verinin bir sonraki adımda işlenebilmesini sağlar. İkinci olarak, "end" olayı, veri akışının tamamlandığını gösterir. Bu olay, hem okunan hem de yazılan veriler için kullanılabilir.

Son olarak, "error" olayı, herhangi bir hata durumunda tetiklenir. Bu olay, olası hataları ele almak ve düzeltmek için kullanılabilir. Örneğin, hatayı görmezden gelerek uygulamanın çökmesini önleyebilirsiniz.

Bu olayları kontrol etmek için birkaç yöntem vardır. Örneğin, "pause()" yöntemi veri akışını durdururken, "resume()" yöntemi veri akışını devam ettirir. Ayrıca, "pipe()" yöntemi, bir Readable stream'i Writable stream'e bağlayarak verilerin akışını başlatır.

Tüm bu özellikler, Node.js Stream kullanarak çoklu veri akışı işlemelerinde büyük kolaylık sağlar. Bu sayede, büyük miktardaki veriler optimize bir şekilde işlenebilir ve bellek kullanımı azaltılabilir. Ayrıca, Stream uygulamalarıyla, web sunucuları, dosya okuma ve yazma işlemleri, TCP soket işlemleri gibi birçok uygulama daha verimli hale getirilebilir.

data

Data olayı, okunan verileri belirtir ve read() yöntemiyle çağrılır. Verileri okumak için bir listener kullanılır. Bu veriler, buffer bileşeninde toplanır ve çağrıldığında hafızadan okunur. Verileri okurken bir sınır belirlenmek isteniyorsa, setEncoding() yöntemi kullanılabilir. Son olarak, end() yöntemi veri akışını sonlandırır. Stream işleminin başarılı olup olmadığını kontrol etmek için error() olayı kullanılabilir.

,

Node.js Stream, pek çok farklı uygulama alanında işleri kolaylaştırır. Örneğin, web sunucuları üzerinde yapılan işlemlerde, büyük boyutlu dosyaların okunması ve yazılması gibi işlemlerde, TCP soket işlemlerinde oldukça kullanışlı bir araçtır.

Ayrıca, Node.js Stream sayesinde dosya okuma/yazma işlemlerinde de daha optimize bir şekilde hareket edilebilir. Verilerin tamponlanması ve hafızada tutulması, kesintisiz bir işleyiş için oldukça önemlidir. Drain() yöntemiyle tamponun boşaltılması sayesinde, hafızada yer kaplamadan verilerin işlenmesi sağlanır.

Node.js Stream, birçok uygulama alanında kolaylıkla kullanılabilen bir araçtır. Kod karmaşıklığını azaltarak, daha optimize bir şekilde kod yazmayı sağlar. Bu sayede hem verimlilik artırılır hem de daha kısa sürede daha kaliteli işler yapılabilmektedir.

end

Writable Stream kullanımında, veri akışının sonlandırılması için end() yöntemi kullanılır. Bu yöntem, veri akışının sonuna ulaşıldığında çağrılır ve artık veri gönderilmeyeceğini belirtir.

Writable Stream kullanırken, verilerin bellekte tamponlanması (buffering) işlemi de kontrol edilebilir. Veriler tamponlandığında drain() yöntemiyle tampon boşaltılır ve yeni veri akışına hazır hale gelir.

Bunun yanı sıra, Stream kullanırken data, end ve error gibi olaylar da gerçekleşir. Veri okuma işlemi sırasında data olayı yer alırken, veri akışının sonlandırılması için end olayı kullanılır. Hatalarla ilgili bilgilendirme yapmak için ise error olayı kullanılır.

ve

Node.js Stream, büyük veri setleriyle çalışırken daha iyi performans elde etmek için kullanışlı bir araçtır. Veriler, bir akış olarak okunup/çıktı veri olarak yazılabilen pek çok farklı türde Stream kullanarak işlenebilir. Readable, Writable, Duplex ve Transform Stream’lerden oluşan 4 farklı Türde enerjili bir sistem sağlar.

Özellikle web sunucusu, dosya okuma/yazma, TCP soket işlemleri gibi uygulamalar, Node.js Stream kullanarak daha optimize bir şekilde gerçekleştirilebilir. Ayrıca Stream olayları da veri akışı işleminin takibi açısından çok önemlidir. Bu sayede veri okuma işlemi sırasında data, end ve error olayları takip edilerek neler olduğu hakkında bilgi edinebilirsiniz.

Özetle Node.js Stream kullanarak veri akışı işleme yöntemlerini kullanarak, daha performanslı, daha az bellek kullanımı ihtiyacı olan, işlem yükü düşük bir uygulama geliştirebilirsiniz.

error

Stream işlemi sırasında herhangi bir hata durumunda error olayı gerçekleşir. Bu olay, hata türüne ve hatanın nerede ortaya çıktığına bağlı olarak farklı şekillerde ele alınabilir. Örneğin, veri okuma işlemi sırasında bir dosya yoksa veya okuma sırasında bir hata oluşursa, okuma işlemi otomatik olarak duracaktır ve error olayı tetiklenecektir.

Hatanın türüne ve kaynağına bağlı olarak, hata nasıl ele alınacağı farklılık gösterir. Bu nedenle, error olayı, işlemin tamamlanmasını engelleyen bir hata olduğunda dikkatli bir şekilde ele alınması gereken önemli bir olaydır.

olayları gerçekleşir.

Node.js Stream, veri okuma işlemi sırasında belirli olayların gerçekleşmesiyle kontrol edilir. Bunlar;

  • data: Veri okuma işlemi sırasında veri akışı boyunca her yeni parça veri için tetiklenir.
  • end: Veri okuma işlemi sona erdiğinde tetiklenir.
  • error: Veri okuma işlemi sırasında bir hata ile karşılaşıldığında tetiklenir.

Stream olayları, veri akışının akışını kontrol etmek, tamponlamayı yönetmek ve hataları ele almak için kullanılır. Bu olaylar, kod içinde tetiklenebilir ve özelleştirilebilir.


Writable Stream

Writable Stream Nedir ve Nasıl Kullanılır?

Node.js Stream kullanarak bir akışın verilerini yazmak için Writable Stream kullanılır. Bu işlem end() yöntemiyle sonlandırılır. Writable Stream, dosya yazmak, web sunucusuna yanıt göndermek ve TCP soketindeki verileri yazmak gibi birçok yerde kullanılabilir.

Verilerin hafızada tamponlanması ve akışa verilerin sıkıştırılması gibi işlemler oldukça önemlidir. Verilerin hafızada tamponlanması, verilerin işlenmesi gerektiğinde bellek kullanımını kontrol etmenize olanak sağlar. Tamponlanmış veri miktarı Stream tarafından kontrol edilir. Eğer belirli bir miktar tamponlanmış veri birikmişse, drain() yöntemi ile tamponun boşaltılması gerekebilir. Bu şekilde, bellek kullanımı azaltılabilir ve akış daha optimize edilmiş hale getirilebilir.

  • Drain() Yöntemi: Eğer tamponlanmış veri miktarı okuma işleminden daha büyükse, yani tampon birikmişse, drain() yöntemi çalıştırarak tamponu boşaltabilirsiniz. Bu yöntem, verilerin yazım hızını kontrol etmenize olanak sağlar.
  • Writable.on("finish", callback): Eğer bir akışın sonuna geldiyseniz, işlemin tamamlandığını belirtmek için bu yöntemi kullanabilirsiniz. Bu yöntem, bazı durumlarda yararlı olabilir, örneğin dosyanın tamamen yazıldığından emin olmak için kullanılabilir.

Overall, Writable Stream, Node.js Stream kullanarak veri aktarım işlemini yazmak için kullanılabilen önemli bir araçtır. Tamponlama ve drain() yöntemi, bellek kullanımını kontrol etmek için önemlidir ve veri aktarımının optimize edilmesine yardımcı olur.


Buffering

Buffering, Node.js Stream kullanarak veri akışı işlemesi sırasında önemli bir yöntemdir. Verilerin hafızada tamponlanması, işlemde kullanılan bellek kullanımının optimize edilmesine yardımcı olur ve veri akışının daha stabil bir şekilde yapılmasını sağlar.

Writable Stream'de buffering, write() yöntemiyle yazılan verilerin hafızada tamponlanmasıdır. Tamponun dolması durumunda, verileri yazdırarak tamponu boşaltmak için drain() yöntemi kullanılabilir. Bu, işlemin daha kontrollü bir şekilde yapılmasını sağlayarak bellek sınırlarının aşılmamasına yardımcı olur.

Bu yöntem sayesinde, büyük ölçekli veri işleme işlemleri daha hızlı ve verimli bir şekilde gerçekleştirilebilir.


Duplex Stream

Duplex Stream, Node.js Stream'in en çok kullanılan türlerinden biridir. Hem okuma hem de yazma işlemleri için kullanılır. Duplex Stream, Readable ve Writable Stream'leri temel alır ve bu nedenle, her iki işlem de aynı anda gerçekleştirilebilir.

Duplex Stream'in en önemli özelliği, veri işleme yöntemidir. Bu akış, aynı anda hem veri okuyabilir hem de veri yazabilir. Veriler, bellek kullanımını azaltmak için küçük parçalar halinde işlenir. Bu nedenle, büyük dosyaların işlenmesi veya ağ üzerinden veri aktarımı gibi işlemler, Duplex Stream kullanılarak daha optimize bir şekilde gerçekleştirilebilir.

Duplex Stream, aynı zamanda TCP soket işlemlerinde de kullanılır. Bu akış, bir istemci ve sunucu arasındaki iletişimi kolaylaştırmak için kullanılabilir. İstemciden gelen veriler okunabilir ve aynı zamanda sunucuya da veri yazılabilir. Bu, düşük gecikme süresine sahip gerçek zamanlı uygulamalar için idealdir.

Sonuç olarak, Duplex Stream, hem okuma hem de yazma işlemleri için kullanılabilen Node.js Stream türlerinden biridir. Bu akış, büyük dosyaların veya ağ üzerinden veri aktarımı gibi işlemlerin daha optimize bir şekilde gerçekleştirilmesini sağlar.


Transform Stream

Transform Stream, okunan verileri dönüştürmek için kullanılır ve kaynak veriyi değiştirmeden akışı değiştirebilir. Readonly veya Writable Stream gibi, Transform Stream de okuma ve yazma işlemleri için kullanılabilir. Bu işlemler sırasında, veriler okunup dönüştürülür ve ardından yazılır.

Bu özellik, veri akışını değiştirmek için oldukça kullanışlıdır. Örneğin, bir veritabanından okunan verinin JSON olarak çıktısı alınabilir ve bu çıktı bir istemciye göndermeden önce dönüştürülüp JSON Web Token formatına çevrilebilir. Bu sayede üçüncü bir tarafın görmesi engellenir ve daha güvenli bir şekilde iletilir.

Aşağıdaki örnekte, Transform Stream kullanarak giriş verilerinin üstündeki harfleri küçük harfe dönüştürüyoruz. Bu örnekte, veriler bir dizi ad olarak tutuluyor ve Transform Stream, her veri elemanını küçük harfe dönüştürüyor:

Örnek Kod:
const { Transform } = require('stream');class LowerCaseTransform extends Transform {  _transform(chunk, encoding, callback) {    const lowerCaseChunk = chunk.toString().toLowerCase();    this.push(lowerCaseChunk);    callback();  }}const names = ['ALICE', 'BOB', 'CAROL'];const nameTransformStream = new LowerCaseTransform();names.forEach(name => {  nameTransformStream.write(name);});nameTransformStream.on('data', data => {  console.log(`Transformed data: ${data}`);});
  • UTF-8 encoding ile Transform Stream oluşturulur.
  • LowerCaseTransform isimli bir sınıf tanımlanır ve Transform sınıfından kalıtım alır. Bu sınıf, gelen verinin küçük harfe dönüştürülmesi işlemini gerçekleştirir.
  • İsimlerin tutulduğu dizi oluşturulur.
  • nameTransformStream, her veri elemanını küçük harfe dönüştürmek üzere oluşturulur. forEach() fonksiyonuyla, tüm verileri döngüye sokar ve dönüştürür.
  • nameTransformStream'de, dönüştürülen veriler data olayı ile yakalanır ve son kullanıcıya bildirilir.

Stream Uygulamaları

Node.js Stream kullanarak pek çok uygulama daha optimize bir şekilde gerçekleştirilebilir. Bunlar arasında web sunucusu, dosya okuma/yazma işlemleri, TCP soket işlemleri ve daha birçok farklı uygulama yer almaktadır.

Bir web sunucusunda, gelen istekler verimli bir şekilde işlenebilir ve yanıtlar daha hızlı bir şekilde hazırlanabilir. Dosya okuma/yazma işlemleri de hızlandırılabilir ve büyük dosyaların okunması veya yazılması sırasında bellek kullanımı önemli ölçüde azaltılabilir. TCP soket işlemleri de stream yöntemi kullanılarak daha optimize hale getirilebilir.

Node.js Stream, zaman içinde iyi test edilip geliştirilmesi nedeniyle, birçok uygulama için hızlı ve güvenilir bir çözüm sunar. Hem okuma hem de yazma işlemleri de dahil olmak üzere, birden fazla Stream türü kullanılarak sistem daha optimize edilebilir.

Node.js Stream ayrıca, birçok popüler modülle de uyumlu bir şekilde çalışabilir. Bu durum, modüllerin Node.js Stream özelliğinden faydalanarak daha hızlı ve verimli bir şekilde çalışmasını sağlar. Tüm bu avantajlar göz önünde bulundurulduğunda, Node.js Stream, web geliştiricileri için önemli bir araç olarak nitelendirilebilir.