devinrio 2010 - nodejs

204
A performance que eu sempre quis ter Emerson Macedo @emerleite http://codificando.com http://visaoagil.wordpress.com/author/emerleite/

Upload: emerson-macedo

Post on 31-May-2015

3.145 views

Category:

Technology


1 download

DESCRIPTION

Palestra de NodeJS apresentada no DevInRio - Apresentado por Emerson Macedo - http://codificando.com. Screencasts em http://nodecasts.org

TRANSCRIPT

Page 1: DevInRio 2010 - NodeJS

A performance que eu sempre quis ter

Emerson Macedo@emerleite

http://codificando.comhttp://visaoagil.wordpress.com/author/emerleite/

Page 2: DevInRio 2010 - NodeJS

#whoami

Page 3: DevInRio 2010 - NodeJS
Page 4: DevInRio 2010 - NodeJS

#performance

Page 5: DevInRio 2010 - NodeJS

2000

Page 6: DevInRio 2010 - NodeJS

360 milhões de usuários de internet

em todo mundo

Page 7: DevInRio 2010 - NodeJS
Page 8: DevInRio 2010 - NodeJS

9,8 milhões de usuários

Page 9: DevInRio 2010 - NodeJS

9,8 milhões de usuários

4,8 milhões são ativos

Page 10: DevInRio 2010 - NodeJS
Page 11: DevInRio 2010 - NodeJS

2010

Page 12: DevInRio 2010 - NodeJS

~ 2 bilhões de usuários de internet

em todo mundo

Page 13: DevInRio 2010 - NodeJS
Page 14: DevInRio 2010 - NodeJS

68 milhões de usuários

Page 15: DevInRio 2010 - NodeJS

68 milhões de usuários

37 milhões são ativos

Page 16: DevInRio 2010 - NodeJS
Page 17: DevInRio 2010 - NodeJS
Page 18: DevInRio 2010 - NodeJS

Tecnologias atuais

Page 19: DevInRio 2010 - NodeJS
Page 20: DevInRio 2010 - NodeJS
Page 21: DevInRio 2010 - NodeJS
Page 22: DevInRio 2010 - NodeJS
Page 23: DevInRio 2010 - NodeJS
Page 24: DevInRio 2010 - NodeJS

Todas essas tecnologias tem algo em comum

Page 25: DevInRio 2010 - NodeJS

PHP 1995

Page 26: DevInRio 2010 - NodeJS

PHP 1995

Java EE 1998

Page 27: DevInRio 2010 - NodeJS

PHP 1995

Java EE 1998

ASP.Net 2002

Page 28: DevInRio 2010 - NodeJS

PHP 1995

Java EE 1998

ASP.Net 2002

Ruby on Rails 2005

Page 29: DevInRio 2010 - NodeJS

PHP 1995

Java EE 1998

ASP.Net 2002

Ruby on Rails 2005

Django 2005

Page 30: DevInRio 2010 - NodeJS

Por que então mais uma tecnologia ?

Page 31: DevInRio 2010 - NodeJS

0

500

1000

1500

2000

2000 2010

2.000 milhões

360 milhões

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

Page 32: DevInRio 2010 - NodeJS

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 33: DevInRio 2010 - NodeJS

Mas já escalamos muito bem nossos sites

Page 34: DevInRio 2010 - NodeJS

Estrutura física de servidores para escalar

Page 35: DevInRio 2010 - NodeJS

Escalando na vertical

Page 36: DevInRio 2010 - NodeJS

Escalando na vertical

Page 37: DevInRio 2010 - NodeJS

Escalando na horizontal

Page 38: DevInRio 2010 - NodeJS

Escalando na horizontal

Page 39: DevInRio 2010 - NodeJS

Escalando na horizontal

Page 40: DevInRio 2010 - NodeJS

Escalando na horizontal

Page 41: DevInRio 2010 - NodeJS
Page 42: DevInRio 2010 - NodeJS

Escalando DB na horizontal

write

read

write write

read

Page 43: DevInRio 2010 - NodeJS

Escalando DB na horizontal

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

Page 44: DevInRio 2010 - NodeJS
Page 45: DevInRio 2010 - NodeJS

Arquitetura pra fazer o software escalar

Page 46: DevInRio 2010 - NodeJS

Pattern para atender muitos requests

Page 47: DevInRio 2010 - NodeJS

Pattern para atender muitos requests

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

Page 48: DevInRio 2010 - NodeJS

HTTP GET

Page 49: DevInRio 2010 - NodeJS
Page 50: DevInRio 2010 - NodeJS
Page 51: DevInRio 2010 - NodeJS
Page 52: DevInRio 2010 - NodeJS
Page 53: DevInRio 2010 - NodeJS
Page 54: DevInRio 2010 - NodeJS

HTTP POST

Page 55: DevInRio 2010 - NodeJS
Page 56: DevInRio 2010 - NodeJS
Page 57: DevInRio 2010 - NodeJS
Page 58: DevInRio 2010 - NodeJS
Page 59: DevInRio 2010 - NodeJS
Page 60: DevInRio 2010 - NodeJS

Por que então mais uma tecnologia ?

Page 61: DevInRio 2010 - NodeJS
Page 62: DevInRio 2010 - NodeJS

Escalando na horizontal

Page 63: DevInRio 2010 - NodeJS

Escalando na horizontal

Page 64: DevInRio 2010 - NodeJS
Page 65: DevInRio 2010 - NodeJS
Page 66: DevInRio 2010 - NodeJS

Evented, non-blocking I/O Google V8 Engine

Page 67: DevInRio 2010 - NodeJS

Qual é o problema das tecnologias atuais ?

Page 68: DevInRio 2010 - NodeJS

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 69: DevInRio 2010 - NodeJS

Nosso código costuma ser escrito assim

Page 70: DevInRio 2010 - NodeJS

Nosso código costuma ser escrito assim

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

Page 71: DevInRio 2010 - NodeJS

Na maioria dos casos está travado esperando

a resposta

Page 72: DevInRio 2010 - NodeJS

Rails ou Django

HTTPD Database

Page 73: DevInRio 2010 - NodeJS

Rails ou Django

HTTPD Database

Page 74: DevInRio 2010 - NodeJS

Rails ou Django

HTTPD Database

Page 75: DevInRio 2010 - NodeJS

Rails ou Django

HTTPD

RUNTIMEPROCESS

Database

Page 76: DevInRio 2010 - NodeJS

Rails ou Django

HTTPD

RUNTIMEPROCESS

Database

BLOCK

Page 77: DevInRio 2010 - NodeJS

Rails ou Django

HTTPD

RUNTIMEPROCESS

RUNTIMEPROCESS

RUNTIMEPROCESS

RUNTIMEPROCESS

Database

BLOCK

BLOCK

BLOCK

BLOCK

Page 78: DevInRio 2010 - NodeJS
Page 79: DevInRio 2010 - NodeJS
Page 80: DevInRio 2010 - NodeJS

Java

HTTPD Database

Servlet Container

Servlet

Page 81: DevInRio 2010 - NodeJS

Java

HTTPD Database

Servlet Container

Servlet

Page 82: DevInRio 2010 - NodeJS

Java

HTTPD Database

Servlet Container

Servlet

Page 83: DevInRio 2010 - NodeJS

Java

HTTPD Database

Servlet ContainerThread

Servlet

Page 84: DevInRio 2010 - NodeJS

Java

HTTPD Database

Servlet ContainerThread

Servlet

BLOCK

Page 85: DevInRio 2010 - NodeJS

Java

HTTPD Database

Servlet ContainerThread

Thread

Thread

Thread

Thread

Thread

Thread

Servlet

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

Page 86: DevInRio 2010 - NodeJS

Apenas um processo abrindo uma thread para cada request

Page 87: DevInRio 2010 - NodeJS
Page 88: DevInRio 2010 - NodeJS
Page 89: DevInRio 2010 - NodeJS

Produtividade do programador mais que

performance da tecnologia

Page 90: DevInRio 2010 - NodeJS

Apenas um processo abrindo uma thread para cada request

Page 91: DevInRio 2010 - NodeJS

Parece bom mas ...

Page 92: DevInRio 2010 - NodeJS

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 93: DevInRio 2010 - NodeJS

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

30 mil threads ?

Page 94: DevInRio 2010 - NodeJS

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 95: DevInRio 2010 - NodeJS

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 96: DevInRio 2010 - NodeJS

Apache cria uma thread por request

Page 97: DevInRio 2010 - NodeJS

Troca de contexto entre theads tem

um custo

Page 98: DevInRio 2010 - NodeJS

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

Page 99: DevInRio 2010 - NodeJS

Não devemos usar uma thread por request

quando precisamos suportar alta concorrência

Page 100: DevInRio 2010 - NodeJS

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 101: DevInRio 2010 - NodeJS
Page 102: DevInRio 2010 - NodeJS

Pattern para atender muitos requests

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

Page 103: DevInRio 2010 - NodeJS

Pattern para atender alta concorrência

Page 104: DevInRio 2010 - NodeJS

Pattern para atender alta concorrência

Não crie threads

Page 105: DevInRio 2010 - NodeJS

Pattern para atender alta concorrência

Não crie threads

Use um Event Loop

Page 106: DevInRio 2010 - NodeJS

Performance!=

Escalabilidade

Page 107: DevInRio 2010 - NodeJS

Performance!=

Escalabilidade

mas ...

Page 108: DevInRio 2010 - NodeJS

Uma performance melhor ajuda a escalar com menos recursos

Page 109: DevInRio 2010 - NodeJS
Page 110: DevInRio 2010 - NodeJS
Page 111: DevInRio 2010 - NodeJS

Precisamos fazer I/O de outra maneira

Page 112: DevInRio 2010 - NodeJS

Latência de I/O

Page 113: DevInRio 2010 - NodeJS

L1 3 ciclos

Latência de I/O

Page 114: DevInRio 2010 - NodeJS

L1 3 ciclos

L2 14 ciclos

Latência de I/O

Page 115: DevInRio 2010 - NodeJS

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Latência de I/O

Page 116: DevInRio 2010 - NodeJS

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Latência de I/O

Page 117: DevInRio 2010 - NodeJS

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 118: DevInRio 2010 - NodeJS

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 119: DevInRio 2010 - NodeJS

I/O não bloqueante

Page 120: DevInRio 2010 - NodeJS

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

Page 121: DevInRio 2010 - NodeJS

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

I/O bloqueante

Page 122: DevInRio 2010 - NodeJS

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 123: DevInRio 2010 - NodeJS

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

software de alta concorrência

Page 124: DevInRio 2010 - NodeJS

Servidor TCP simples em NodeJS

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

Page 125: DevInRio 2010 - NodeJS

Por que já não faziamos dessa forma ?

Page 126: DevInRio 2010 - NodeJS
Page 127: DevInRio 2010 - NodeJS

POSIX Assync I/O não suportado por todos

os S.Os

Page 128: DevInRio 2010 - NodeJS

POSIX Assync I/O não suportado por todos

os S.Os

libmysql_client não permite query async

Page 129: DevInRio 2010 - NodeJS

Filosofia do NodeJS

Page 130: DevInRio 2010 - NodeJS

Filosofia do NodeJS

Todo I/O deveria ser feito desta forma

Page 131: DevInRio 2010 - NodeJS

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

Page 132: DevInRio 2010 - NodeJS

Arquitetura

eventloop

(libev)

threadpool

(libeio)

V8

Node Bindings

Node standard libraryJavascript

C

Page 133: DevInRio 2010 - NodeJS

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

Page 134: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

Page 135: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

Page 136: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

load(“index.html”)

I/O em disco (bloqueante)

Page 137: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

Page 138: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

Page 139: DevInRio 2010 - NodeJS

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

Page 140: DevInRio 2010 - NodeJS

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

Page 141: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 142: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 143: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

http_respond(2)

I/O em RAM (não bloqueante)

Page 144: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 145: DevInRio 2010 - NodeJS

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 146: DevInRio 2010 - NodeJS

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

Page 147: DevInRio 2010 - NodeJS

ev_loop()

Pilha de execução

Arquivo carregou do disco

Page 148: DevInRio 2010 - NodeJS

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

Page 149: DevInRio 2010 - NodeJS

ev_loop()

file_loaded()

http_respond(1)

Pilha de execução

Arquivo carregou do disco

Page 150: DevInRio 2010 - NodeJS

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

Page 151: DevInRio 2010 - NodeJS

ev_loop()

Pilha de execução

Arquivo carregou do disco

Page 152: DevInRio 2010 - NodeJS

Arquitetura Web

Page 153: DevInRio 2010 - NodeJS

Arquitetura Web

Nginx

Page 154: DevInRio 2010 - NodeJS

Arquitetura Web

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Nginx

Page 155: DevInRio 2010 - NodeJS

Arquitetura Web

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Rubyor

Python

Nginx

NodeJS

Page 156: DevInRio 2010 - NodeJS

Arquitetura Web

Nginx

Page 157: DevInRio 2010 - NodeJS

Arquitetura Web

Nginx

NodeJS

Page 158: DevInRio 2010 - NodeJS

Arquitetura Web

NodeJS

Page 159: DevInRio 2010 - NodeJS

Arquitetura Web

NodeJS

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

entrada. Será ?

Page 164: DevInRio 2010 - NodeJS

#simplicidade

Page 165: DevInRio 2010 - NodeJS

Produtividade do programador mais que

performance da tecnologia

Page 166: DevInRio 2010 - NodeJS
Page 167: DevInRio 2010 - NodeJS
Page 168: DevInRio 2010 - NodeJS
Page 169: DevInRio 2010 - NodeJS
Page 170: DevInRio 2010 - NodeJS

Don’t Repeat Yourself

Page 171: DevInRio 2010 - NodeJS
Page 172: DevInRio 2010 - NodeJS
Page 173: DevInRio 2010 - NodeJS
Page 174: DevInRio 2010 - NodeJS
Page 175: DevInRio 2010 - NodeJS
Page 176: DevInRio 2010 - NodeJS
Page 177: DevInRio 2010 - NodeJS

XML

Properties

YAML

Configurações

Page 178: DevInRio 2010 - NodeJS

XML

Properties

YAML

Configurações

JSON

Transporte

Page 179: DevInRio 2010 - NodeJS

Configurações

JSON

Page 180: DevInRio 2010 - NodeJS

Configurações

JSON

Page 181: DevInRio 2010 - NodeJS

Configurações

JSON

Transporte

Page 182: DevInRio 2010 - NodeJS

Configurações

Javascript Object Notation

Transporte

Page 183: DevInRio 2010 - NodeJS

Java Ruby Python

Server Side

PHP

Page 184: DevInRio 2010 - NodeJS

Java Ruby Python

Server Side

PHP

Client Side

JavaScript

Page 185: DevInRio 2010 - NodeJS

Server Side

JavaScript

Page 186: DevInRio 2010 - NodeJS

Server Side

JavaScript

Page 187: DevInRio 2010 - NodeJS

Server Side

JavaScript

Client Side

Page 188: DevInRio 2010 - NodeJS

#ecossistema

Page 189: DevInRio 2010 - NodeJS
Page 190: DevInRio 2010 - NodeJS

Sinatra detected !

Page 191: DevInRio 2010 - NodeJS
Page 192: DevInRio 2010 - NodeJS

Test driven development#vows - http://vowsjs.org/

Page 193: DevInRio 2010 - NodeJS

Test driven development

Page 194: DevInRio 2010 - NodeJS

Test driven development#http://github.com/visionmedia/expresso/

Page 195: DevInRio 2010 - NodeJS
Page 196: DevInRio 2010 - NodeJS
Page 197: DevInRio 2010 - NodeJS
Page 198: DevInRio 2010 - NodeJS
Page 199: DevInRio 2010 - NodeJS
Page 200: DevInRio 2010 - NodeJS
Page 201: DevInRio 2010 - NodeJS

#surpresa

Page 202: DevInRio 2010 - NodeJS
Page 203: DevInRio 2010 - NodeJS

Obrigado !!!

Emerson Macedo@emerleite

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