Node js part 1 shared

  • View
    230

  • Download
    1

Embed Size (px)

Text of Node js part 1 shared

PowerPoint Presentation

NodeJSby Ryan DahlCreated by Engin Yelgen

1

Temel zellikleriYazm Javascript gibi fakat server-side alan bir uygulamaReal-timeEvent-basedLow level language C gibiJS basitliiAsynchronous(non-blocking) uygulamaScalable network

2

Google V8 Javascript engine

Google NodeJS i V8 Javascript engine adn verdii katmanda temel bir ktphanede kullanyor.3

Real-time web uygulamalar

NodeJS in yaratcs Ryan Dahl amac real-time web oluturmakt. Yazlmclara non-blocking, event-driven I/O programlama yapabilecekleri bir ara verdi.Websocket ler zerinden push teknolojisini kullanan real-time web uygulamalar ile parlad. Real-time web uygulamalar hem server hem de client arasnda kurulan ift tarafl balant ile iletiimi balatabilir. 4

Neden baarl?KolaylkEilim

Node event-driven I/O programlama yapmakta kullanlan en kolay yoldur ve dier platformlara nazaran anlamas daha kolaydr ve baarldr Node btn problemleri zmeye almaz; fonksiyonel ve karmak olmayan API leri kullanan temel internet protokollerini destekler ve temelini kurar5

NodeJS artk bir ok nl firmann teknolojilerini gelitirmesinde nemli rol oynar6

Event Loopsoftware pattern non-blocking I/O program

var post = db.query(select * from posts where id = 1);doSomethingWithPost(post);doSomethingElse(); Blocking

Yukardaki kod parasnda database query tamamlanncaya kadar btn ilemler atl kalr ve cevabn gelmesini bekler. Buna blocking denir.

Bu yolla programlama paralel I/O ilemi yapmanza izin vermez(rn: baka bir database de query altrmak veya uzak web servis ile balant kurmak)

7

Bundan syrlmann 2 yntemi vardr;

Daha fazla call stack yaratmakEvent-driven I/O kullanmak

Callback = function(post){doSomethingWithPost(post); // yalnzca db.query fonksiyonu bittii anda altrlr.};

db.query(select * from posts where id=1, callback);doSomethingElse(); // db.query fonksiyonun bitmesini beklemeden alr. (asynchronous)

leminizin e zamanl daha fazla I/O gerekletirmesini istiyorsanz thread leri kullanabilirsiniz fakat multi-threaded modelleri yaplandrmas, anlamas ve debug yapmas olduka zordur.

Callback mekanizmas bilindii gibi belli bir olayn gereklemesiyle tetiklenir. Aslnda bir fonksiyondur. Bu yzden event callback kullanmak daha akllca bir zm olacaktr.

8

Bu yzden event driven programlama e zamanl bir ok balanty kontol altnda tutmak iin en iyi yoldur. Bu sayede server kullanmn da kontrol altnda tutmu oluruz.

JS closure ve first-class functions

(function(){var clickCount = 0;document.getElementById(mybutton).onclick = function(){clickCount++;alert(Clicked + clickCount + times.);};})(); // Closure: bu kod blounun deikenlerine dardan eriilemez. Kendi ortamndaki deikenleri kullanr.Neden JS ?

Bu da onu event-driven I/O programlamada gl bir seim yapyor.

Bu da NodeJS in kalbidir, onun baarl olmasnda gl bir zelliktir.

10

var myFunc = function(){console.log(hello);}

(function(){myFunc();})();

// First-class function: bir fonksiyonu bir deikene atayabiliriz ve bu deikeni fonksiyon gibi istediimiz yerden arabiliriz.

var scheduler = function(timeout, callbackfunction){return function(){setTimeout(callbackfunction, timeout) // callbackfunction timeout sresi sonunda altrlr}};

(function(){// bu deikenlere scope dndan eriilemez..var timeout = 1000; // 1 saniyevar count = 0;// daha nceden tanmladmz fonksiyonu aryoruz ve gereken parametreleri gnderiyoruzvar schedule = scheduler(timeout, function doStuff(){console.log(++count);schedule();});schedule() // yukardaki deikene atadmz fonksiyonu tekrar altryoruz})(); // ierde tanmladmz fonksiyon bu satr yorumlandnda altrlr

Ayn zamanda bir fonksiyona zellik atayabilir, bunu iindeki objelere geirebiliriz, ierden bir sonu dndrebiliriz.12

NodeJS PHP

Response times

Temel ama Non-blocking, event-driven I/O yaplar kullanarak, data younluuyla kar karya kalan real-time uygulamalarda verimlilii artrmak, younluu azaltmak.Nasl alr ?

NodeJS yksek CPU kullanan ilemlerde kullanmak tavsiye edilmez; ar derecede hesaplama olan ilemlerde kullanmak hemen hemen btn avantajlarn geri evirmek olur.

nk Node hzl ve leklendirilebilen network uygulamalaryla n kazanmtr. Yani byk miktarda e zamanl balanty verimli bir ekilde idare edebilme kabiliyetine sahiptir.

Her balant yeni bir thread talep eder. Bu da yksek oranda RAM kullanm anlamna gelir.Non-blocking I/O call kullanarak tek bir thread ile on binlerce e zamanl balantya destek verir.

Farzedelim ki her bir thread e 2 MB memory tahsis edilse, sistemimizde de 8 GB ram bulunuyorsa, teorik olarak maksimum 4000 e zamanl balant aabilir. Art bi de thread ler arasndaki context switching. Bundan kamak istiyorsan, Node bir milyonun zerinde e zamanl balanty ynetebilme baarsna sahiptir.16

Tek bir thread ile btn client isteklerine cevap vermek yeterli olur mu? Acaba bir sorun meydana gelir mi?

Tabi ki gelir..

lk olarak ar derecede hesaplama olan ilemler thread i tkayabilir bu da btn client lar iin problem dourabilir.

- Mesala gelen istekler hesaplama tamamlanncaya kadar bloklanabilir.

- Halbuki event-loop iinde her an bir exeption ile kar karya kalabilirsiniz. Bu da programn crash olmasna, sonlanmasna neden olabilir.17

Exception lar programn crash olmasna sebep olmadan nasl ele alabiliriz?

lk akla gelen callback fonksiyonlarn iinde gelen err parametresini kullanmak olur..

Ya da..

Ama her ikisi de kt bir kullanm rneidir.

nk...

18

Hatay yakaladnz zaman uygulamay unclean state de dikkate alm olursun. Bu nokta da uygulamaya gvenilir bir ekilde devam edemezsin.

Daha iyisi..

var cluster = require('cluster'); var workers = process.env.WORKERS || require('os').cpus().length; if (cluster.isMaster) { console.log('start cluster with %s workers', workers); for (var i = 0; i < workers; ++i) { var worker = cluster.fork().process; console.log('worker %s started.', worker.pid); } cluster.on('exit', function(worker) { console.log('worker %s died. restart...', worker.process.pid); cluster.fork(); }); } else { var http = require('http'); http.createServer(function (req, res) { res.end('Look Mum! I'm a server!\n'); }).listen(3000, "127.0.0.1"); } process.on('uncaughtException', function (err) { console.error((new Date).toUTCString() + ' uncaughtException:', err.message) console.error(err.stack) process.exit(1) })

Alnan hata log dosyasna kaydedip uygulamann restart olmasn salyor. Bu sayede de uygulamann crash olmasn ve thread in tkanmasnn nne geiyoruz.

20

https://npmjs.org/ sitesinden NPM modllerine gzatabilir, indirebilirsiniz. stersenizde NPM CLI kullanarak da indirme ilemini yapabilirsiniz.

Express ou NodeJS uygulamasn bulabilirsiniz.Connect HTTP server frameworkSocket.io ve sockjs en yaygn websocket server-side component leriJade template engineMongo ve mongojs API(MongoDB object databases)Redis client ktphanesicoffee-script compilerunderscore(lodash,lazy)- en popler JS utility ktphanesiForever CLI toolNPM: The Node Package Manager

NodeJS den bahsederken NPM i bahsetmeden geemeyiz. NPM 2 eyi bnyesinde barndrr. Birincisi yaynlanan open-source NodeJS projeleri. kincisi uygulamay yazarken kullandmz moduller. Bir ok NodeJS ktphanesi ve uygulamas NPM de yaynlanr.21

NodeJS nerelerde kullanlmas uygun olur?

CHAT

Youn trafik, data younluu olan ama dk seviyede ilem/hesaplama olan bir uygulama. Tek bir chatroom; insanlarn biraraya geldii ve mesaj al-veriinde bulunduu.23

Express.jsRequest handlerWebsocket server

Request handler = message board ve send butonundan yeni mesaj oluturmasnda hizmet eder.Websocket server = websocket client yaynlanan mesajlar dinler.24

Button click event

HTML PageWebsocket client

Button click event = mesaj giriini yakalar ve websocket e gnderir.Websocket client = yeni gelen mesajlar dinler.25

Mesaj gnderiliyor...

Send button click: mesaj yakala Websocket client: server ile balanty kur ve mesaj yaynla

Websocket server: mesaj al ve dier bal client lara ilet(broadcast)

Websocket client: tm client lar mesaj ald ve mesaj pencereleri gncellendi..

API ON TOP OF AN OBJECT DB

JSON objelerini herhangi bir convert ilemi yapmadan REST API araclyla kullanclara iletebilirsin. Eer Mongo DB kullanyorsan da database den okuma ve yazma ilemlerinde de JSON convert etmene gerek yoktur.27

QUEUED INPUTS

Data younluu fazla olan uygulamalarda; kullancy hemen bilgilendir sanki istek baarlyla tamamlanm gibi ama database e yazma isteini engelle taki younluk geene kadar. stekle daha sonra ilgilen.

Caching veya message queuing altyaps..(RabbitMQ,ZeroMQ)

Eer e zamanl olarak byk miktarlarda data alyorsanz database yavalayabilir. Bu da ileminizin bloklanmasna ve kullanc isteklerinin ge cevaplanmasna neden olabilir.28

DATA STREAMINGReal-time audio video encoding

Encode video upload olurken. nk NodeJS video yu kullanclarn upload etmesinden ok daha ksa srede encode eder. Bu da upload ile encode arasnda bir gecikme olmamas demek. Zamandan kazan; upload ileminden sonra sonra encode iin bir ek sre daha harcamaya gerek yok. Yukardaki video da bu sayede ilemi 150 kat hzla tamamlayabiliyoruz..Sadece realtime: true demek yeterli, bu ilemi yapabilmek iin.

29

PROXY

NodeJS i server-side proxy iin kullanabilirsin. nk NodeJS e zamanl bir ok balanty non-blocking mantyla stesinden gelebilir. zellikle farkl servisler iin farkl farkl istekler geldiinde ya da farkl bir ok noktadan gelen verileri toplamakta kullanldr30

BROKERAGE - STOCK TRADERS DASHBOARD

rnek: Real-time web uygulamas Broker lar iin. Ki buradan s