Node.Js Giriş

Node.Js ile ilgili yazı serisi yazmaya başlıyorum. Uzun zamandır yazmayı düşündüğüm bir konu hakkında kendimi geliştirirken buradan paylaşmanın güzel olacağını düşündüm.

Kısaca tanımlayacak olursak; Javascript üzerinde server-side uygulamalar yazmamızı sağlayan bir framework’dür.

Kendi sitesinde kullandığı tanım;

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

Sitesinde ve birçok kaynakta nasıl kurulduğu ve npm ile paket yönetimi nasıl yapılır detaylı anlatılmaktadır. Uzunca nasıl kurulduğu hakkında yazı yazmaktan ziyade Node.Js’nin sağladığı faydalardan başlayalım.

Chrome web browserlarının da üzerinde çalıştığı V8 engine yapısını kullanmaktadır. V8 kullanması hız ve performans artışı sağlamaktadır. Tanımda belirtildiği gibi I/O ve network işlemlerini non-blocking olarak çalıştırmaktadır. Yani herhangi bir işlemin bitmesini beklemeden diğer event ile ilgili işlem başlamaktadır. Örneğin veritabanı sorgusunun sonucu beklemeden başka bir işleme geçilmektedir. Böylece performans artışı önemli bir biçimde görmülmektedir. Real-time ( gerçek zamanlı ) uygulamalar yaparken tüm kullanıcılara aynı anda bilgi akışı sağlanmaktadır.

threading_node

Resimde görüldüğü gibi clientlar tarafından request yapılmaktadır. Event loop yapısı içerisinde istekleri değerlendirip işlemektedir. Non-blocking yapısı sayesinde herhangi bir bekleme olmamaktadır.

Başta Linkedin ve paypal olmak üzere önemli firmalar tarafından kullanılmaktadır.

1 – Asynchronous(Asenktron) ve Event-driven(Olay tabanlı): browser

Node server-side ve client side için event driven ve asenkron bir yapı sunmaktadır. I/O işlemleri yaparken non-blocking yapısı vardır.

Async I/O: Mevcut işlem bitmeden diğer yapılmak istenilen işlemlerin halledilmesine olanak sağlar.

Browser üzerinde non-blocking yapı aşağıda gösterilmiştir. Belirtilen json dosyasından verileri okuma işlemi devam ederken farklı bir request yapabilmekteyiz. I/O işlemi event loop dışında gerçekleşmektedir. Veri okuma işlemi bitince callback fonksiyonu çağrılıp console.log ile veriler ekrana basılıyor.

nonblockingbrowser

Browser daha esnek bir yapıya kavuşuyor. Pek çok istek aynı anda işlenebiliyor.

2 – Asynchronous(Asenktron) ve Event-driven(Olay tabanlı): server

var result = query(“SELECT * FROM table”) syntax’a dikkat etmden bir db sorgusunu temsilen yazalım. Bu işlemi normal şekilde tanımlarsak, tüm veriler okunmadan diğer işlemler dikkate alınmayacaktır. Blocking I/O yapısı vardır.

Bu sorunu çözmek için multithread yapı kullanırsak, bir süre sonra multihreadleri kontrol etmek zorlaşabilir. (örn Apache). Thread sayısı arttıkça context switch işlemi artacaktır. Dolayısıyla ciddi bir performans kaybı yaşanacaktır.

Farklı bir çözüm olarak non-blocking yapı kullanıp aynı anda birçok request talebi işlersek daha esnek bir yapı oluşacaktır. (örn NGINX) Tek thread kullanmasına rağmen apache’ye göre daha hızlı şekilde istekleri değerlendirir.

nginx-apache-reqs-sec

Node içerisinde, I/O işlemleri her zaman event loop dışında gerçekleşmektedir. Server’ın esnek ve kullanışlı olmasını sağlar. (örnek nginx (3x daha hızlı) )

3 – DIRTy uygulamalar ( data intensive real time ) 

Server tarafında gerçekleşen değişikliklerin client tarafında sayfa yenilemeden anlık olarak gösteren uygulamalardır. Birden fazla istek aynı anda gerçekleştirilebilir. Node DIRTy uygulamaları desteklemektedir. Browser ve server arasında tutarlılık sağlanır.

İlk node.js yazısını kısa bir hello world örneği ile bitirelim. server.js adında dosya oluşturup aşağıdaki kodları yazalım.

Cmd ekranında ilgili klasöre gelip. “node server.js” yazıp serverı çalıştırırız.

Ardından browser üzerinden localhost:3000 adresini açarsak ekranda hello world yazısı gözükecektir.

Node.Js’e kısaca tanıtmış olduk. Daha detaylı öğrenmek isteyenler kaynakçada bulunan linklere bakabilirler. Özellikle kitapları ücretsiz olarak pdf biçiminde bulabiliyoruz.

Kaynakça