Node.JS nedir?
Node.js açık kaynaklı (open source) olup sunucu tarafından çalışabilen ağ ile ilişkili uygulamalar için geliştirilen bir çalışma ortamıdır (runtime environment).
İlk olarak 27 Mayıs 2009'da yayınlanmıştır. Nodejs joyent'in bir markasıdır. oogle’ın Javascript v8 motorunu kullanarak Node.JS uygulamaları çalıştırılmakta. Javascript programlama dili ile gelen olay bazlı mimariyi destekler. Yani bir işlem arka planda asenkron olarak başlatılır ve işlem bitiminde bir event çalıştırılır buda eş zamanlılığı destekleyen bir unsurdur. Böylelikle performans büyük ölçüde arttırılır.
Bu arada buraya önemli bir not düşmekte fayda var. Event driving programming concurrency(eşzamanlılık)’i desteklemesine karşın yazılan uygulama büyüdüğü takdirde inline fonksiyon gibi çok fazla kullanılmaması gerekenlerin kullanılmaması durumunda bakımı zorlaştırabilecek unsurlar gibi görmekteyim.
Bunun dışında I/O işlemleri Node.JS ile son derece hızlı bir şekilde yapılabilir. Nasıl yüklenir nasıl çalışılır konusunda da bir iki örnek vermek gerekirse, IDE olarak Visual Studio Code’u tercih edebilirsiniz. IntelliSense gerçekten bu konuda iyi iş beceriyor. Debug gibi işlemleri de burada rahatlıkla yapabiliyorsunuz.
Node.js uygulamaları genel olarak javascript ile geliştirilir. En önemli avantajı javascript'in sağladığı non-blocking I/Oimkanı sayesinde yüksek ölçeklenebilirlik (ing. scalability) ve yüksek veri aktarabilme kabiliyetleridir. Bu teknolojiler sıklıkla gerçek zamanlı web uygulamalarında tercih edilmekle beraber, kullanım alanı popülaritesiyle orantılı olarak genişlemiştir.
Popülerliği zamanla artan bu platform milyonlara hitap eden web uygulamalarının da tercihi oldu. Örneğin Linkedin mobilsunucu tarafında NodeJS'e geçmeden önce Rails kullanıyordu. NodeJS 'e geçişten sonra server maliyeti 30 sunucudan 3 sunucuya düştü ve bazı işlemlerde 20 kata kadar varan hız artışı sağlandı.
Aynı şekilde Paypal NodeJS'ye geçiş yapan devler arasında. Ürün ortamını riske etmemek adına direkt NodeJS'e geçişi göze alamayan PayPal, Java ve NodeJS olarak 2 plaftormda paralel olarak geliştirmeye başlıyor. Java takımında 5 kişilik bir ekip varken NodeJS tarafında 2 kişilik bir ekip çalışıyor. Java tarafında hazır olan geliştirme ve çalışma ortamını kurmak NodeJS ekibinin 2 ayını alıyor.
Yani 2 ay boyunca java takımı geliştirme yaparken NodeJS takımı sadece gerekli alt yapıyı kurmakla uğraşıyor. 6 ayın sonunda ise NodeJS ekibi java ekibini yakalıyor aynı fonksiyonaliteye sahip uygulamayı geliştirmeyi başarıyorlar. Daha az kişilik bir ekiple 2 aylık gecikmeyle 2 katı bulan geliştirme hızına ulaşmış, %33 oranında daha az satır kod yazılmış ve %40 daha az dosya ile geliştirme yapılmasına imkan tanımıştır.
NodeJS nasıl çalışır?
Öncelikle V8 javascript motorundan biraz söz edelim. V8 daha öncede belirttiğimiz gibi chrome web tarayıcılarınında üzerinde çalıştığı google tarafından geliştirilen , C/C++ ve javascript dilleriyle geliştirilen esasında yaptığı iş javascript kodunu makine koduna (native machine code) çevirmek olan bir javascript motoru. NodeJS de bu yüksek performanslı javascript motorunun üzerine inşa edilmiş bir platform.
NodeJS platformunda iş parçacığı mantığının yerine her bir olayın sıraya atılarak işlenmesi söz konusu. Non-blocking I/O yapısı ile birleşince bu yapı yüksek performanslı uygulamalar çıkarmamıza, düşük özellikli sunucularla bile milyonlarca web istemini (web request) karşılamamıza imkan sağlıyor. Javascript’in doğasında olan asenkron programlama yapısıda bu modele bire bir uyum sağlıyor.
NodeJS ’in çalışma yapısının bir örnekle açıklamaya çalışalım. Bir fast-food restorantında tek bir personelin çalıştığını ve sipariş verdiğinizde, çalışanın ödemenizin alınmasından, yiyeceğinizin hazırlanmasına kadar yani sizin işiniz tamamen bitene kadar başka bir sipariş almadığını varsayalım. Bu durumda oluşacak sırayı gözünüzde canlandırın.
Böyle bir modelde daha fazla sipariş almanın tek yolu çalışan sayısını arttırmaktır. Hatta ve hatta bir noktada çalışan sayısının artması bile bizi istediğimiz çözüme ulaştırmayacaktır. Burada sipariş alma bloklama gerektirmeyen bir işlemken yiyeceğin hazırlanma süreci bloklama gerektiren bir iştir. Bloklama gerektiren bir işten dolayı bu yapıda tüm işlemler durmakta, bloklama yapan işlemin bitmesini beklemektedir. ,
Bloklama yapmayan (non-blocking) bir yapıda ise bloklama yapmayan işlemler işlenir bloklama yapan işlemler başlatılır ve sonuçları callback adı verilen geri dönüş metodları aracılığıyla elde edilir. Yiyeceğiniz hazırlandıktan sonra çağrılmanız callback’ler için verilebilecek güzel bir örnektir.