secomp 2011 - node.js - introdução

Post on 06-Dec-2014

1.015 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Palestra introdutória de Node.JS na Universidade Estadual de Londrina, no evento SECOMP 2011

TRANSCRIPT

Introdução ao Node.JS

Emerson Macedo@emerleite

http://nodecasts.orghttp://codificando.com

#whoami

#performance

2000

360 milhões de usuários de internet

em todo mundo

9,8 milhões de usuários

9,8 milhões de usuários

4,8 milhões são ativos

2010

~ 2 bilhões de usuários de internet

em todo mundo

68 milhões de usuários

68 milhões de usuários

37 milhões são ativos

2014

~ 70% dos adultos serão usuários regulares de redes sociais

Tecnologias atuais

Todas essas tecnologias tem algo em comum

PHP 1995

PHP 1995

Java EE 1998

PHP 1995

Java EE 1998

ASP.Net 2001

PHP 1995

Java EE 1998

ASP.Net 2001

Ruby on Rails 2004

PHP 1995

Java EE 1998

ASP.Net 2001

Ruby on Rails 2004

Django 2006

Por que então mais uma tecnologia ?

0

500

1000

1500

2000

2000 2010

2.000 milhões

360 milhões

Usuários de Internet no Mundo (em milhões)

0

17,5

35

52,5

70

2000 2010

70 milhões

10 milhões

Usuários de Internet no Brasil (em milhões)

Mas já escalamos muito bem nossos sites

Estrutura física de servidores para escalar

Escalando na vertical

Escalando na vertical

Escalando na horizontal

Escalando na horizontal

Escalando na horizontal

Escalando na horizontal

Escalando DB na horizontal

write

read

write write

read

Escalando DB na horizontal

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

Arquitetura pra fazer o software escalar

Pattern para atender muitos requests

Pattern para atender muitos requests

Finalize a requisição o mais rápido possível

HTTP GET

HTTP POST

Por que então mais uma tecnologia ?

Escalando na horizontal

Escalando na horizontal

Qual é o problema das tecnologias atuais ?

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Nosso código costuma ser escrito assim

Nosso código costuma ser escrito assim

O que o software está fazendo enquanto a querie executa ?

Na maioria dos casos está travado esperando

a resposta

Rails ou Django

HTTPD Database

Rails ou Django

HTTPD Database

Rails ou Django

HTTPD Database

Rails ou Django

HTTPD

RUNTIMEPROCESS

Database

Rails ou Django

HTTPD

RUNTIMEPROCESS

Database

BLOCK

Rails ou Django

HTTPD

RUNTIMEPROCESS

RUNTIMEPROCESS

RUNTIMEPROCESS

RUNTIMEPROCESS

Database

BLOCK

BLOCK

BLOCK

BLOCK

Java

HTTPD Database

Servlet Container

Servlet

Java

HTTPD Database

Servlet Container

Servlet

Java

HTTPD Database

Servlet Container

Servlet

Java

HTTPD Database

Servlet ContainerThread

Servlet

Java

HTTPD Database

Servlet ContainerThread

Servlet

BLOCK

Java

HTTPD Database

Servlet ContainerThread

Thread

Thread

Thread

Thread

Thread

Thread

Servlet

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

Apenas um processo abrindo uma thread para cada request

Produtividade do programador mais que

performance da tecnologia

Apenas um processo abrindo uma thread para cada request

Parece bom mas ...

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

30 mil threads ?

Apache vs NGINXconcurrency × reqs/sec

http://blog.webfaction.com/a-little-holiday-present

Apache vs NGINXconcurrency × reqs/sec

http://blog.webfaction.com/a-little-holiday-present

Apache vs NGINXconcurrency × memory

http://blog.webfaction.com/a-little-holiday-present

Apache vs NGINXconcurrency × reqs/sec

http://blog.webfaction.com/a-little-holiday-present

Apache cria uma thread por request

Troca de contexto entre theads tem

um custo

Cada OS Thread cria uma pilha de execução nova

Pense bem antes de usar uma thread por

request quando precisar suportar alta

concorrência

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Pattern para atender muitos requests

Finalize a requisição o mais rápido possível

Pattern para atender alta concorrência

Pattern para atender alta concorrência

Evite threads

Pattern para atender alta concorrência

Evite threads

Use um Event Loop

Performance!=

Escalabilidade

Performance!=

Escalabilidade

mas ...

Uma performance melhor ajuda a escalar com menos recursos

Precisamos fazer I/O de outra maneira

Latência de I/O

L1 3 ciclos

Latência de I/O

L1 3 ciclos

L2 14 ciclos

Latência de I/O

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Latência de I/O

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Latência de I/O

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Rede 240.000.000 ciclos

Latência de I/O

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Rede 240.000.000 ciclos

Latência de I/O

I/O não bloqueante

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

I/O bloqueante

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Rede 240.000.000 ciclos

I/O não bloqueante

I/O bloqueante

Infraestrutura não bloqueante, puramente baseada em eventos, para desenvolver

software de alta concorrência

Servidor TCP simples em NodeJS

O código acima faz com que a execução retorne imediatamente ao event loop

Filosofia do NodeJS

Filosofia do NodeJS

Todo I/O deveria ser feito desta forma

Para qualquer operação que acesse o disco ou a rede deve existir um callback ou

um evento

Arquitetura

eventloop

(libev)

threadpool

(libeio)

V8

Node Bindings

Node standard libraryJavascript

C

IOCP

(async)

unix windows

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

load(“index.html”)

I/O em disco (bloqueante)

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

http_respond(2)

I/O em RAM (não bloqueante)

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

ev_loop()

Pilha de execução

Arquivo carregou do disco

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

ev_loop()

file_loaded()

http_respond(1)

Pilha de execução

Arquivo carregou do disco

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

ev_loop()

Pilha de execução

Arquivo carregou do disco

Arquitetura Web

Arquitetura Web

Nginx

Arquitetura Web

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Nginx

Arquitetura Web

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Nginx

NodeJS

Arquitetura Web

Nginx

Arquitetura Web

Nginx

NodeJS

Arquitetura Web

NodeJS

Arquitetura Web

NodeJS

Quando NodeJS estiver bem maduro, a idéia de Ryan é que ele seja a porta de

entrada. Será ?

#simplicidade

Produtividade do programador mais que

performance da tecnologia

Don’t Repeat Yourself

XML

Properties

YAML

Configurações

XML

Properties

YAML

Configurações

JSON

Transporte

Configurações

JSON

Configurações

JSON

Configurações

JSON

Transporte

Configurações

Javascript Object Notation

Transporte

Java Ruby Python

Server Side

PHP

Java Ruby Python

Server Side

PHP

Client Side

JavaScript

Server Side

JavaScript

Server Side

JavaScript

Server Side

JavaScript

Client Side

#ecossistema

#realtime

#database

#web

#template

#testes

#hospedagem

#nginx

#aprender

Obrigado !!!

Emerson Macedo@emerleite

http://nodecasts.orghttp://codificando.com

top related