secomp 2011 - node.js - introdução

229
Introdução ao Node.JS Emerson Macedo @emerleite http://nodecasts.org http://codificando.com

Upload: emerson-macedo

Post on 06-Dec-2014

1.015 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Secomp 2011 - Node.JS - Introdução

Introdução ao Node.JS

Emerson Macedo@emerleite

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

Page 2: Secomp 2011 - Node.JS - Introdução

#whoami

Page 3: Secomp 2011 - Node.JS - Introdução
Page 4: Secomp 2011 - Node.JS - Introdução
Page 5: Secomp 2011 - Node.JS - Introdução
Page 6: Secomp 2011 - Node.JS - Introdução
Page 7: Secomp 2011 - Node.JS - Introdução
Page 8: Secomp 2011 - Node.JS - Introdução

#performance

Page 9: Secomp 2011 - Node.JS - Introdução

2000

Page 10: Secomp 2011 - Node.JS - Introdução

360 milhões de usuários de internet

em todo mundo

Page 11: Secomp 2011 - Node.JS - Introdução
Page 12: Secomp 2011 - Node.JS - Introdução

9,8 milhões de usuários

Page 13: Secomp 2011 - Node.JS - Introdução

9,8 milhões de usuários

4,8 milhões são ativos

Page 14: Secomp 2011 - Node.JS - Introdução

2010

Page 15: Secomp 2011 - Node.JS - Introdução

~ 2 bilhões de usuários de internet

em todo mundo

Page 16: Secomp 2011 - Node.JS - Introdução
Page 17: Secomp 2011 - Node.JS - Introdução

68 milhões de usuários

Page 18: Secomp 2011 - Node.JS - Introdução

68 milhões de usuários

37 milhões são ativos

Page 19: Secomp 2011 - Node.JS - Introdução
Page 20: Secomp 2011 - Node.JS - Introdução

2014

Page 21: Secomp 2011 - Node.JS - Introdução

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

Page 22: Secomp 2011 - Node.JS - Introdução
Page 23: Secomp 2011 - Node.JS - Introdução
Page 24: Secomp 2011 - Node.JS - Introdução
Page 25: Secomp 2011 - Node.JS - Introdução
Page 26: Secomp 2011 - Node.JS - Introdução
Page 27: Secomp 2011 - Node.JS - Introdução

Tecnologias atuais

Page 28: Secomp 2011 - Node.JS - Introdução
Page 29: Secomp 2011 - Node.JS - Introdução
Page 30: Secomp 2011 - Node.JS - Introdução
Page 31: Secomp 2011 - Node.JS - Introdução
Page 32: Secomp 2011 - Node.JS - Introdução
Page 33: Secomp 2011 - Node.JS - Introdução

Todas essas tecnologias tem algo em comum

Page 34: Secomp 2011 - Node.JS - Introdução

PHP 1995

Page 35: Secomp 2011 - Node.JS - Introdução

PHP 1995

Java EE 1998

Page 36: Secomp 2011 - Node.JS - Introdução

PHP 1995

Java EE 1998

ASP.Net 2001

Page 37: Secomp 2011 - Node.JS - Introdução

PHP 1995

Java EE 1998

ASP.Net 2001

Ruby on Rails 2004

Page 38: Secomp 2011 - Node.JS - Introdução

PHP 1995

Java EE 1998

ASP.Net 2001

Ruby on Rails 2004

Django 2006

Page 39: Secomp 2011 - Node.JS - Introdução

Por que então mais uma tecnologia ?

Page 40: Secomp 2011 - Node.JS - Introdução

0

500

1000

1500

2000

2000 2010

2.000 milhões

360 milhões

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

Page 41: Secomp 2011 - Node.JS - Introdução

0

17,5

35

52,5

70

2000 2010

70 milhões

10 milhões

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

Page 42: Secomp 2011 - Node.JS - Introdução

Mas já escalamos muito bem nossos sites

Page 43: Secomp 2011 - Node.JS - Introdução

Estrutura física de servidores para escalar

Page 44: Secomp 2011 - Node.JS - Introdução

Escalando na vertical

Page 45: Secomp 2011 - Node.JS - Introdução

Escalando na vertical

Page 46: Secomp 2011 - Node.JS - Introdução

Escalando na horizontal

Page 47: Secomp 2011 - Node.JS - Introdução

Escalando na horizontal

Page 48: Secomp 2011 - Node.JS - Introdução

Escalando na horizontal

Page 49: Secomp 2011 - Node.JS - Introdução

Escalando na horizontal

Page 50: Secomp 2011 - Node.JS - Introdução
Page 51: Secomp 2011 - Node.JS - Introdução

Escalando DB na horizontal

write

read

write write

read

Page 52: Secomp 2011 - Node.JS - Introdução

Escalando DB na horizontal

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

Page 53: Secomp 2011 - Node.JS - Introdução
Page 54: Secomp 2011 - Node.JS - Introdução

Arquitetura pra fazer o software escalar

Page 55: Secomp 2011 - Node.JS - Introdução

Pattern para atender muitos requests

Page 56: Secomp 2011 - Node.JS - Introdução

Pattern para atender muitos requests

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

Page 57: Secomp 2011 - Node.JS - Introdução

HTTP GET

Page 58: Secomp 2011 - Node.JS - Introdução
Page 59: Secomp 2011 - Node.JS - Introdução
Page 60: Secomp 2011 - Node.JS - Introdução
Page 61: Secomp 2011 - Node.JS - Introdução
Page 62: Secomp 2011 - Node.JS - Introdução
Page 63: Secomp 2011 - Node.JS - Introdução

HTTP POST

Page 64: Secomp 2011 - Node.JS - Introdução
Page 65: Secomp 2011 - Node.JS - Introdução
Page 66: Secomp 2011 - Node.JS - Introdução
Page 67: Secomp 2011 - Node.JS - Introdução
Page 68: Secomp 2011 - Node.JS - Introdução
Page 69: Secomp 2011 - Node.JS - Introdução

Por que então mais uma tecnologia ?

Page 70: Secomp 2011 - Node.JS - Introdução
Page 71: Secomp 2011 - Node.JS - Introdução

Escalando na horizontal

Page 72: Secomp 2011 - Node.JS - Introdução

Escalando na horizontal

Page 73: Secomp 2011 - Node.JS - Introdução
Page 74: Secomp 2011 - Node.JS - Introdução
Page 75: Secomp 2011 - Node.JS - Introdução

Qual é o problema das tecnologias atuais ?

Page 76: Secomp 2011 - Node.JS - Introdução

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 77: Secomp 2011 - Node.JS - Introdução

Nosso código costuma ser escrito assim

Page 78: Secomp 2011 - Node.JS - Introdução

Nosso código costuma ser escrito assim

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

Page 79: Secomp 2011 - Node.JS - Introdução

Na maioria dos casos está travado esperando

a resposta

Page 80: Secomp 2011 - Node.JS - Introdução

Rails ou Django

HTTPD Database

Page 81: Secomp 2011 - Node.JS - Introdução

Rails ou Django

HTTPD Database

Page 82: Secomp 2011 - Node.JS - Introdução

Rails ou Django

HTTPD Database

Page 83: Secomp 2011 - Node.JS - Introdução

Rails ou Django

HTTPD

RUNTIMEPROCESS

Database

Page 84: Secomp 2011 - Node.JS - Introdução

Rails ou Django

HTTPD

RUNTIMEPROCESS

Database

BLOCK

Page 85: Secomp 2011 - Node.JS - Introdução

Rails ou Django

HTTPD

RUNTIMEPROCESS

RUNTIMEPROCESS

RUNTIMEPROCESS

RUNTIMEPROCESS

Database

BLOCK

BLOCK

BLOCK

BLOCK

Page 86: Secomp 2011 - Node.JS - Introdução
Page 87: Secomp 2011 - Node.JS - Introdução
Page 88: Secomp 2011 - Node.JS - Introdução

Java

HTTPD Database

Servlet Container

Servlet

Page 89: Secomp 2011 - Node.JS - Introdução

Java

HTTPD Database

Servlet Container

Servlet

Page 90: Secomp 2011 - Node.JS - Introdução

Java

HTTPD Database

Servlet Container

Servlet

Page 91: Secomp 2011 - Node.JS - Introdução

Java

HTTPD Database

Servlet ContainerThread

Servlet

Page 92: Secomp 2011 - Node.JS - Introdução

Java

HTTPD Database

Servlet ContainerThread

Servlet

BLOCK

Page 93: Secomp 2011 - Node.JS - Introdução

Java

HTTPD Database

Servlet ContainerThread

Thread

Thread

Thread

Thread

Thread

Thread

Servlet

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

Page 94: Secomp 2011 - Node.JS - Introdução

Apenas um processo abrindo uma thread para cada request

Page 95: Secomp 2011 - Node.JS - Introdução
Page 96: Secomp 2011 - Node.JS - Introdução
Page 97: Secomp 2011 - Node.JS - Introdução

Produtividade do programador mais que

performance da tecnologia

Page 98: Secomp 2011 - Node.JS - Introdução

Apenas um processo abrindo uma thread para cada request

Page 99: Secomp 2011 - Node.JS - Introdução

Parece bom mas ...

Page 100: Secomp 2011 - Node.JS - Introdução

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 101: Secomp 2011 - Node.JS - Introdução

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

30 mil threads ?

Page 102: Secomp 2011 - Node.JS - Introdução

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

Page 103: Secomp 2011 - Node.JS - Introdução

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

Page 104: Secomp 2011 - Node.JS - Introdução

Apache cria uma thread por request

Page 105: Secomp 2011 - Node.JS - Introdução

Troca de contexto entre theads tem

um custo

Page 106: Secomp 2011 - Node.JS - Introdução

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

Page 107: Secomp 2011 - Node.JS - Introdução

Pense bem antes de usar uma thread por

request quando precisar suportar alta

concorrência

Page 108: Secomp 2011 - Node.JS - Introdução

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 109: Secomp 2011 - Node.JS - Introdução
Page 110: Secomp 2011 - Node.JS - Introdução

Pattern para atender muitos requests

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

Page 111: Secomp 2011 - Node.JS - Introdução

Pattern para atender alta concorrência

Page 112: Secomp 2011 - Node.JS - Introdução

Pattern para atender alta concorrência

Evite threads

Page 113: Secomp 2011 - Node.JS - Introdução

Pattern para atender alta concorrência

Evite threads

Use um Event Loop

Page 114: Secomp 2011 - Node.JS - Introdução

Performance!=

Escalabilidade

Page 115: Secomp 2011 - Node.JS - Introdução

Performance!=

Escalabilidade

mas ...

Page 116: Secomp 2011 - Node.JS - Introdução

Uma performance melhor ajuda a escalar com menos recursos

Page 117: Secomp 2011 - Node.JS - Introdução
Page 118: Secomp 2011 - Node.JS - Introdução
Page 119: Secomp 2011 - Node.JS - Introdução

Precisamos fazer I/O de outra maneira

Page 120: Secomp 2011 - Node.JS - Introdução

Latência de I/O

Page 121: Secomp 2011 - Node.JS - Introdução

L1 3 ciclos

Latência de I/O

Page 122: Secomp 2011 - Node.JS - Introdução

L1 3 ciclos

L2 14 ciclos

Latência de I/O

Page 123: Secomp 2011 - Node.JS - Introdução

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Latência de I/O

Page 124: Secomp 2011 - Node.JS - Introdução

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Latência de I/O

Page 125: Secomp 2011 - Node.JS - Introduçã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

Page 126: Secomp 2011 - Node.JS - Introduçã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

Page 127: Secomp 2011 - Node.JS - Introdução

I/O não bloqueante

Page 128: Secomp 2011 - Node.JS - Introdução

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

Page 129: Secomp 2011 - Node.JS - Introdução

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

I/O bloqueante

Page 130: Secomp 2011 - Node.JS - Introdução

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

Page 131: Secomp 2011 - Node.JS - Introdução

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

software de alta concorrência

Page 132: Secomp 2011 - Node.JS - Introdução

Servidor TCP simples em NodeJS

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

Page 133: Secomp 2011 - Node.JS - Introdução

Filosofia do NodeJS

Page 134: Secomp 2011 - Node.JS - Introdução

Filosofia do NodeJS

Todo I/O deveria ser feito desta forma

Page 135: Secomp 2011 - Node.JS - Introdução

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

um evento

Page 136: Secomp 2011 - Node.JS - Introdução

Arquitetura

eventloop

(libev)

threadpool

(libeio)

V8

Node Bindings

Node standard libraryJavascript

C

IOCP

(async)

unix windows

Page 137: Secomp 2011 - Node.JS - Introdução

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

Page 138: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

Page 139: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

Page 140: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

load(“index.html”)

I/O em disco (bloqueante)

Page 141: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

Page 142: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

Page 143: Secomp 2011 - Node.JS - Introdução

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

Page 144: Secomp 2011 - Node.JS - Introdução

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

Page 145: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 146: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 147: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

http_respond(2)

I/O em RAM (não bloqueante)

Page 148: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 149: Secomp 2011 - Node.JS - Introdução

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 150: Secomp 2011 - Node.JS - Introdução

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

Page 151: Secomp 2011 - Node.JS - Introdução

ev_loop()

Pilha de execução

Arquivo carregou do disco

Page 152: Secomp 2011 - Node.JS - Introdução

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

Page 153: Secomp 2011 - Node.JS - Introdução

ev_loop()

file_loaded()

http_respond(1)

Pilha de execução

Arquivo carregou do disco

Page 154: Secomp 2011 - Node.JS - Introdução

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

Page 155: Secomp 2011 - Node.JS - Introdução

ev_loop()

Pilha de execução

Arquivo carregou do disco

Page 156: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

Page 157: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

Nginx

Page 158: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Nginx

Page 159: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Nginx

NodeJS

Page 160: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

Nginx

Page 161: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

Nginx

NodeJS

Page 162: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

NodeJS

Page 163: Secomp 2011 - Node.JS - Introdução

Arquitetura Web

NodeJS

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

entrada. Será ?

Page 164: Secomp 2011 - Node.JS - Introdução

#simplicidade

Page 165: Secomp 2011 - Node.JS - Introdução

Produtividade do programador mais que

performance da tecnologia

Page 166: Secomp 2011 - Node.JS - Introdução
Page 167: Secomp 2011 - Node.JS - Introdução
Page 168: Secomp 2011 - Node.JS - Introdução
Page 169: Secomp 2011 - Node.JS - Introdução
Page 170: Secomp 2011 - Node.JS - Introdução

Don’t Repeat Yourself

Page 171: Secomp 2011 - Node.JS - Introdução
Page 172: Secomp 2011 - Node.JS - Introdução
Page 173: Secomp 2011 - Node.JS - Introdução
Page 174: Secomp 2011 - Node.JS - Introdução
Page 175: Secomp 2011 - Node.JS - Introdução
Page 176: Secomp 2011 - Node.JS - Introdução
Page 177: Secomp 2011 - Node.JS - Introdução

XML

Properties

YAML

Configurações

Page 178: Secomp 2011 - Node.JS - Introdução

XML

Properties

YAML

Configurações

JSON

Transporte

Page 179: Secomp 2011 - Node.JS - Introdução

Configurações

JSON

Page 180: Secomp 2011 - Node.JS - Introdução

Configurações

JSON

Page 181: Secomp 2011 - Node.JS - Introdução

Configurações

JSON

Transporte

Page 182: Secomp 2011 - Node.JS - Introdução

Configurações

Javascript Object Notation

Transporte

Page 183: Secomp 2011 - Node.JS - Introdução

Java Ruby Python

Server Side

PHP

Page 184: Secomp 2011 - Node.JS - Introdução

Java Ruby Python

Server Side

PHP

Client Side

JavaScript

Page 185: Secomp 2011 - Node.JS - Introdução

Server Side

JavaScript

Page 186: Secomp 2011 - Node.JS - Introdução

Server Side

JavaScript

Page 187: Secomp 2011 - Node.JS - Introdução

Server Side

JavaScript

Client Side

Page 188: Secomp 2011 - Node.JS - Introdução

#ecossistema

Page 189: Secomp 2011 - Node.JS - Introdução

#realtime

Page 190: Secomp 2011 - Node.JS - Introdução
Page 191: Secomp 2011 - Node.JS - Introdução
Page 192: Secomp 2011 - Node.JS - Introdução
Page 193: Secomp 2011 - Node.JS - Introdução

#database

Page 194: Secomp 2011 - Node.JS - Introdução
Page 195: Secomp 2011 - Node.JS - Introdução
Page 196: Secomp 2011 - Node.JS - Introdução
Page 197: Secomp 2011 - Node.JS - Introdução
Page 198: Secomp 2011 - Node.JS - Introdução

#web

Page 199: Secomp 2011 - Node.JS - Introdução
Page 200: Secomp 2011 - Node.JS - Introdução
Page 201: Secomp 2011 - Node.JS - Introdução

#template

Page 202: Secomp 2011 - Node.JS - Introdução
Page 203: Secomp 2011 - Node.JS - Introdução
Page 204: Secomp 2011 - Node.JS - Introdução
Page 205: Secomp 2011 - Node.JS - Introdução
Page 206: Secomp 2011 - Node.JS - Introdução

#testes

Page 207: Secomp 2011 - Node.JS - Introdução
Page 208: Secomp 2011 - Node.JS - Introdução
Page 209: Secomp 2011 - Node.JS - Introdução
Page 210: Secomp 2011 - Node.JS - Introdução
Page 211: Secomp 2011 - Node.JS - Introdução
Page 212: Secomp 2011 - Node.JS - Introdução

#hospedagem

Page 213: Secomp 2011 - Node.JS - Introdução
Page 214: Secomp 2011 - Node.JS - Introdução
Page 215: Secomp 2011 - Node.JS - Introdução
Page 216: Secomp 2011 - Node.JS - Introdução
Page 217: Secomp 2011 - Node.JS - Introdução
Page 218: Secomp 2011 - Node.JS - Introdução
Page 219: Secomp 2011 - Node.JS - Introdução

#nginx

Page 220: Secomp 2011 - Node.JS - Introdução

#aprender

Page 221: Secomp 2011 - Node.JS - Introdução
Page 222: Secomp 2011 - Node.JS - Introdução
Page 223: Secomp 2011 - Node.JS - Introdução
Page 224: Secomp 2011 - Node.JS - Introdução
Page 225: Secomp 2011 - Node.JS - Introdução
Page 226: Secomp 2011 - Node.JS - Introdução
Page 227: Secomp 2011 - Node.JS - Introdução
Page 228: Secomp 2011 - Node.JS - Introdução
Page 229: Secomp 2011 - Node.JS - Introdução

Obrigado !!!

Emerson Macedo@emerleite

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