Teknoloji

NodeJS Nedir?

nodejs-1024x768NodeJS Nedir?

NodeJS, Chrome web tarayıcısının da üzerinde çalıştığı gibi, V8 javascript motoru üzerinde çalışan, event-driven, nonblocking I/O modeli kullanan, ölçeklenebilir uygulamalar geliştirmek için dizayn edilmiş bir platformdur. Açık kaynak bir proje olan NodeJS 2009 yılında geliştirilmeye başlanmış olup Joyent şirketinin kayıtlı bir markasıdır.

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.

Neden NodeJS?

Web uygulamalarını tek bir cümlede özetleyecek olursak yapılması gereken işlem bir port üzerinden istemleri dinlemek ve ilgili istemlere uygun cevapları dönmektir. Peki bu cümlede kulağa bu kadar basit gelen bir işlemin karşılanabilmesi için kullandığımız web sunucularına bakacak olursak tüketilen kaynağın yapılan işleme oranla çok fazla olduğunu görürüz. Java tarafında GlassFish, JBOSS, WebLogic, TomCat .NET tarafında IIS sunucularının tükettiği kaynakları, yönetimlerinin ve konfigürasyonlarının ne kadar kompleks yapılar olduğunu tek tek anlatmaya gerek olmadığını düşünüyorum. NodeJS tarafında ise uygulama sunucusunu da biz yazıyoruz. Hem de yaklaşık beş satırlık bir kod ile.

var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(1337, ‘127.0.0.1’);
console.log(‘Server running at http://127.0.0.1:1337/‘);

Yukarıda yer alan kod örneği nodejs.org’un ana sayfasından alınan örnek web sunucu kodudur. 1337 numaralı porttan gelen istemlere “Hello World” cevabını dönmektedir. Böyle bir yapı web sunucuları tarafından harcanan kaynak miktarını azalttığı gibi yönetimde tüm kontrole sahip olmamızı sağlamaktadır.

NodeJS’den bahsedip de NPM (node package manager)’ den bahsetmeden olmaz. NPM NodeJS kurulumu ile birlikte gelen paket yönetim aracıdır. NPM üzerinde komünite tarafından geliştirilen açık kaynaklı NodeJS modülleri yer almaktadır.Her gün daha fazla büyüyen ve geliştireceğiniz uygulamayla ilgili aklınıza gelen hemen hemen her türlü kütüphanenin bulunduğu bu canlı ve dinamik yapı çok daha hızlı geliştirme yapma imkanı sağlamaktadır.

Tüm bunların yanı sıra sunucu tarafında javascript yazmak başta kulağa ürkütücü gelse de client tarafında javascript yazmadan geliştirme yapmanın neredeyse imkansız olduğu günümüz şartlarında geliştiricilerin tek bir dil bilmesini yeterli hale getiriyor.

Popülerliği giderek artan bu platform milyonlara hitap eden web uygulamalarının da dikkatinden kaçmadı. Burada Linkedin[1] ve PayPal[2] örneklerinden bahsetmek istiyorum. Linkedin mobil sunucu tarafında NodeJS ’e geçmeden önce Rails kullanıyordu. NodeJS ’e geçişten sonra avantajları sıraladıklarında

  • 30 sunucudan 3 sunucuya düşen server maliyeti.

  • Bazı işlemlerde 20 kata kadar varan hız artışı

  • Geliştiricilerin tek bir dil üzerinde anlaşabiliyor olması ve backend geliştiricilerinin javascript geliştirme yeteneklerinin artması.

maddeleri yer almaktadır.

PayPal örneği ise daha yakın tarihli. Ü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 ve aşağıda sıralayacağım farklarla.

  • Neredeyse 2 katı bulan geliştirme hızı

  • %33 oranında daha az satır kodla yazılması

  • %40 oranında daha az dosya ile geliştirilmesi.

Gelelim performans karşılaştırmasına.Yaptıkları testler sonucunda NodeJS uygulamasının java uygulamasına göre 2 kat daha fazla saniyelik istemi(request per sec) karşılayabildiğini görmüşler. Üstelik NodeJS uygulaması tek çekidekli bir işlemci üzerinden çalışırken java uygulamasının beş çekirdekli işlemci üzerinde çalışmasına rağmen.

İkinci olarak cevap süresinde (response time) %35 oranında artış tespit etmişler.Bu da her bir cevabın yaklaşık 200 ms daha hızlı karşılanmasına karşılık geliyor.

Özetlemek gerekirse NodeJS özellikle web dünyasında hızla yerini almış bence yeterli olgunluğa ulaşmış, ölçeklenebilirlik açısından nosql veri tabanlarıyla da son derece uyumlu çalışabilmesi sayesinde tercih edilebilecek en uygun geliştirme platformu. NodeJS ’in bir programlama dili olmadığını anlamak , sunduğu çözümleri ihtiyaçlarımızı karşılamasına göre değerlendirerek kullanmak gerektiğini de belirtelim.

Kaynaklar

[1] http://highscalability.com/blog/2012/10/4/linkedin-moved-from-rails-to-node-27-servers-cut-and-up-to-2.html

[2] https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/