SlideShare a Scribd company logo
A performance que eu sempre quis ter
                 Emerson Macedo
                    @emerleite
              http://codificando.com
http://visaoagil.wordpress.com/author/emerleite/
#whoami
DevInRio 2010 - NodeJS
#performance
2000
360 milhões de
usuários de internet
  em todo mundo
DevInRio 2010 - NodeJS
9,8 milhões de usuários
9,8 milhões de usuários

4,8 milhões são ativos
DevInRio 2010 - NodeJS
2010
~ 2 bilhões de
usuários de internet
  em todo mundo
DevInRio 2010 - NodeJS
68 milhões de usuários
68 milhões de usuários

37 milhões são ativos
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Tecnologias
  atuais
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Todas essas tecnologias
 tem algo em comum
PHP   1995
PHP      1995
Java EE   1998
PHP      1995
Java EE   1998
ASP.Net   2002
PHP         1995
   Java EE      1998
  ASP.Net       2002

Ruby on Rails   2005
PHP         1995
   Java EE      1998
  ASP.Net       2002

Ruby on Rails   2005
   Django       2005
Por que então mais
 uma tecnologia ?
Usuários de Internet no Mundo (em milhões)
                                      2.000 milhões
2000


1500


1000


 500     360 milhões


   0
           2000                          2010
Usuários de Internet no Brasil (em milhões)
                                        70 milhões
 70


52,5


 35


17,5
         10 milhões


  0
           2000                           2010
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
DevInRio 2010 - NodeJS
Escalando DB na horizontal


                                   re
                                      ad
      ad
   re




                   write




           write           write
Escalando DB na horizontal




 Shard      Shard      Shard      Shard      Shard      Shard
Database   Database   Database   Database   Database   Database
DevInRio 2010 - NodeJS
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
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
HTTP POST
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Por que então mais
 uma tecnologia ?
DevInRio 2010 - NodeJS
Escalando na horizontal
Escalando na horizontal
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Evented, non-blocking I/O
    Google V8 Engine
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
          RUNTIME
          PROCESS




 HTTPD              Database
Rails ou Django
          RUNTIME
                    BLOCK
          PROCESS




 HTTPD                      Database
Rails ou Django
          RUNTIME
                    BLOCK
          PROCESS




          RUNTIME
                    BLOCK
          PROCESS

 HTTPD                      Database
          RUNTIME
                    BLOCK
          PROCESS




          RUNTIME
          PROCESS   BLOCK
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Java
           Servlet Container




HTTPD          Servlet         Database
Java
           Servlet Container




HTTPD          Servlet         Database
Java
           Servlet Container




HTTPD          Servlet         Database
Java
                  Servlet Container
         Thread




HTTPD                 Servlet         Database
Java
                  Servlet Container
         Thread                 BLOCK




HTTPD                 Servlet           Database
Java
                  Servlet Container
         Thread                 BLOCK


         Thread                 BLOCK


         Thread                 BLOCK
HTTPD                 Servlet           Database
         Thread                 BLOCK


         Thread                 BLOCK


         Thread                 BLOCK


         Thread                 BLOCK
Apenas um processo
abrindo uma thread
 para cada request
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
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 ?
concurrency × reqs/sec

 Apache vs NGINX
 concurrency × reqs/sec




 http://blog.webfaction.com/a-little-holiday-present
http://blog.webfaction.com/a-little-holiday-present
concurrency × reqs/sec

 Apache vs NGINX
 concurrency × memory




  http://blog.webfaction.com/a-little-holiday-present
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
Não devemos usar
uma thread por request
  quando precisamos
     suportar alta
     concorrência
Como manter
conectados 10, 20 ou
   30 mil usuários
    simultâneos ?
DevInRio 2010 - NodeJS
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

 Não crie threads
Pattern para atender
 alta concorrência

 Não crie threads
Use um Event Loop
Performance
     !=
Escalabilidade
Performance
     !=
Escalabilidade
  mas ...
Uma performance
melhor ajuda a escalar
com menos recursos
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Precisamos fazer I/O
 de outra maneira
Latência de I/O
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
I/O não bloqueante
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 bloqueante
I/O não bloqueante
 L1           3 ciclos
 L2           14 ciclos
RAM          250 ciclos
   I/O bloqueante
Disco     41.000.000 ciclos
Rede     240.000.000 ciclos
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
Por que já não
faziamos dessa forma ?
DevInRio 2010 - NodeJS
POSIX Assync I/O não
 suportado por todos
       os S.Os
POSIX Assync I/O não
 suportado por todos
       os S.Os

 libmysql_client não
permite query async
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
Arquitetura
Javascript   Node standard library




    C             Node Bindings


                    thread     event
                     pool      loop
             V8
                    (libeio)   (libev)
Pilha de execução




          ev_loop()




 I/O em disco (bloqueante)
Pilha de execução



      socket_readdable(1)


           ev_loop()




 I/O em disco (bloqueante)
Pilha de execução


         http_parse(1)


      socket_readdable(1)


           ev_loop()




 I/O em disco (bloqueante)
Pilha de execução

       load(“index.html”)


         http_parse(1)


      socket_readdable(1)


           ev_loop()




 I/O em disco (bloqueante)
Pilha de execução


         http_parse(1)


      socket_readdable(1)


           ev_loop()




 I/O em disco (bloqueante)
Pilha de execução



      socket_readdable(1)


           ev_loop()




 I/O em disco (bloqueante)
Pilha de execução




          ev_loop()




 I/O em disco (bloqueante)
Pilha de execução




         ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução



      socket_readdable(2)


           ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução


         http_parse(2)


      socket_readdable(2)


           ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução

        http_respond(2)


         http_parse(2)


      socket_readdable(2)


           ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução


         http_parse(2)


      socket_readdable(2)


           ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução



      socket_readdable(2)


           ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução




         ev_loop()




 I/O em RAM (não bloqueante)
Pilha de execução




          ev_loop()




 Arquivo carregou do disco
Pilha de execução



        file_loaded()


          ev_loop()




 Arquivo carregou do disco
Pilha de execução


        http_respond(1)


         file_loaded()


           ev_loop()




 Arquivo carregou do disco
Pilha de execução



        file_loaded()


          ev_loop()




 Arquivo carregou do disco
Pilha de execução




          ev_loop()




 Arquivo carregou do disco
Arquitetura Web
Arquitetura Web


      Nginx
Arquitetura Web


                      Nginx




 Ruby     Ruby     Ruby        Ruby     Ruby
  or       or       or          or       or
Python   Python   Python      Python   Python
Arquitetura Web


                      Nginx




 Ruby     Ruby     Ruby        Ruby     Ruby
  or       or       or          or       or     NodeJS
Python   Python   Python      Python   Python
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á ?
http://tjholowaychuk.com/post/543953703/express-vs-sinatra-benchmarks
http://tjholowaychuk.com/post/543953703/express-vs-sinatra-benchmarks
http://tjholowaychuk.com/post/543953703/express-vs-sinatra-benchmarks
http://tjholowaychuk.com/post/543953703/express-vs-sinatra-benchmarks
#simplicidade
Produtividade do
programador mais que
   performance da
      tecnologia
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Don’t Repeat Yourself
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
Configurações
        Properties
XML                  YAML
Configurações
        Properties
XML                  YAML
          JSON

       Transporte
Configurações



    JSON
Configurações


    JSON
Configurações


    JSON



 Transporte
Configurações


Javascript Object Notation



     Transporte
Server Side

Java   Ruby   Python   PHP
Server Side

Java   Ruby   Python   PHP

       Client Side

        JavaScript
Server Side




 JavaScript
Server Side

 JavaScript
Server Side

 JavaScript



Client Side
#ecossistema
DevInRio 2010 - NodeJS
Sinatra detected !
DevInRio 2010 - NodeJS
Test driven development
#vows - http://vowsjs.org/
Test driven development
Test driven development
#http://github.com/visionmedia/expresso/
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
#surpresa
DevInRio 2010 - NodeJS
Obrigado !!!
    Emerson Macedo
        @emerleite
   http://nodecasts.org
  http://codificando.com
Referências
http://www.internetworldstats.com/emarketing.htm
http://en.wikipedia.org/wiki/Event_loop
http://lse.sourceforge.net/io/aio.html
http://code.google.com/p/v8/
http://opengroup.org/onlinepubs/007908775/xsh/select.html
http://en.wikipedia.org/wiki/Thread_pool_pattern
http://www.commonjs.org/specs/modules/1.0/
http://en.wikipedia.org/wiki/File_descriptor
http://en.wikipedia.org/wiki/Reactor_pattern

More Related Content

Viewers also liked (20)

PPTX
IoTizando com JavaScript
Heider Lopes
 
PDF
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Emerson Macedo
 
PPS
No Llores
guestb1358fc
 
PDF
Node js
Ederson de Lima
 
ODP
GDG NodeJS Sem Segredos
Caio Cutrim
 
PDF
EasyTaxi e MongoDB - Showcase
Yuri Teixeira
 
PPT
Equipe Origami City
CEPMBB
 
PDF
Node js - O poder do JavaScript do lado do servidor
Romulo Fagundes
 
PPTX
MEAN Full Stack JavaScript - TaSafoConf 2015
Kaio Valente
 
ODP
Conhecendo o Nodejs
Caio Cutrim
 
PDF
NodeJS - E/S não-bloqueante - Dirigido a Eventos
Átila Camurça
 
PPTX
Guia utilização e desenvolvimento de aplicação no PaaS c9.io
marcochella
 
PDF
Adwords Express: como anunciar?
Mateada
 
PDF
Mean Stack - Aplicações Web Modernas com MEAN
João Gabriel Lima
 
PPT
Javascript nos dias de hoje
Caio Ribeiro Pereira
 
PPT
Node.js em produção, javascript no server side
Thiago Avelino
 
PDF
Node js - Javascript Server Side
Gustavo Corrêa Alves
 
PDF
Node.js, Uma breve introdução
Pablo Feijó
 
PDF
[NodeConf.eu 2014] Scaling AB Testing on Netflix.com with Node.js
Alex Liu
 
KEY
Uma visão rápida sobre Nodejs
Rafael Soares
 
IoTizando com JavaScript
Heider Lopes
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Emerson Macedo
 
No Llores
guestb1358fc
 
GDG NodeJS Sem Segredos
Caio Cutrim
 
EasyTaxi e MongoDB - Showcase
Yuri Teixeira
 
Equipe Origami City
CEPMBB
 
Node js - O poder do JavaScript do lado do servidor
Romulo Fagundes
 
MEAN Full Stack JavaScript - TaSafoConf 2015
Kaio Valente
 
Conhecendo o Nodejs
Caio Cutrim
 
NodeJS - E/S não-bloqueante - Dirigido a Eventos
Átila Camurça
 
Guia utilização e desenvolvimento de aplicação no PaaS c9.io
marcochella
 
Adwords Express: como anunciar?
Mateada
 
Mean Stack - Aplicações Web Modernas com MEAN
João Gabriel Lima
 
Javascript nos dias de hoje
Caio Ribeiro Pereira
 
Node.js em produção, javascript no server side
Thiago Avelino
 
Node js - Javascript Server Side
Gustavo Corrêa Alves
 
Node.js, Uma breve introdução
Pablo Feijó
 
[NodeConf.eu 2014] Scaling AB Testing on Netflix.com with Node.js
Alex Liu
 
Uma visão rápida sobre Nodejs
Rafael Soares
 

Similar to DevInRio 2010 - NodeJS (20)

ODP
Seminario Ruby On Rails Aula Open Source
Sergio Alonso
 
PDF
FISL11 2010 - Automação de Datacenters
iG - Internet Group do Brasil S/A
 
PDF
Core rest edgarsilva_v1
Edgar Silva
 
PDF
Ria的强力后盾:rest+海量存储
zhen chen
 
ODP
Der lachende Dritte
joachimweinbrenner
 
PPTX
Seguridad en Servicios Web
Hacking Bolivia
 
PDF
Webperfdays 2014 - common web performance mistakes
dkoston
 
PDF
HTML5 WebSocket 발표 자료
Zany Lee
 
PDF
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Dr. Spock
 
PPTX
2010 06 15 SecondNug - JAVA vs NET
Bruno Capuano
 
PDF
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest
 
PDF
Nodejs on android
俊夫 森
 
PDF
Glass fishjavaee6directseminar
Yoshio Terada
 
PPTX
Ruby on windows 2010
Akio Tajima
 
PPTX
автоматизация Flex приложений с помощью selenium rc
Igor Khrol
 
DOCX
Comparaciones oracle y sql
JUAN ENRIQUE
 
PDF
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Pedro Valera
 
PDF
No sql pour valtech tech days
Claude Falguiere
 
PDF
The new release of Oracle BI 11g R1 - OGH – 15 September 2010
Daan Bakboord
 
PDF
Social networks analisys - github API
baturin
 
Seminario Ruby On Rails Aula Open Source
Sergio Alonso
 
FISL11 2010 - Automação de Datacenters
iG - Internet Group do Brasil S/A
 
Core rest edgarsilva_v1
Edgar Silva
 
Ria的强力后盾:rest+海量存储
zhen chen
 
Der lachende Dritte
joachimweinbrenner
 
Seguridad en Servicios Web
Hacking Bolivia
 
Webperfdays 2014 - common web performance mistakes
dkoston
 
HTML5 WebSocket 발표 자료
Zany Lee
 
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Dr. Spock
 
2010 06 15 SecondNug - JAVA vs NET
Bruno Capuano
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest
 
Nodejs on android
俊夫 森
 
Glass fishjavaee6directseminar
Yoshio Terada
 
Ruby on windows 2010
Akio Tajima
 
автоматизация Flex приложений с помощью selenium rc
Igor Khrol
 
Comparaciones oracle y sql
JUAN ENRIQUE
 
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Pedro Valera
 
No sql pour valtech tech days
Claude Falguiere
 
The new release of Oracle BI 11g R1 - OGH – 15 September 2010
Daan Bakboord
 
Social networks analisys - github API
baturin
 
Ad

More from Emerson Macedo (20)

PDF
ElixirConf 2019 - 10M Monthly Ad Insertions with Phoenix and Broadway
Emerson Macedo
 
PDF
The Conf 2019 - Elixir - Emerson Macedo
Emerson Macedo
 
PDF
Wanna be a manager? Not today - QCon São Paulo 2019
Emerson Macedo
 
PDF
TheConf 2018 - How does your app behave when everything goes wrong
Emerson Macedo
 
PDF
DevConf OpenSanca 2018 - How does your application behaves when everything go...
Emerson Macedo
 
PDF
How your app behaves when everything goes wrong - Ruby Conf BR 2017
Emerson Macedo
 
PDF
Beyond your daily coding - The Conf Brazil 2017 Keynote
Emerson Macedo
 
PDF
CEJS 2016 - Please learn that shit
Emerson Macedo
 
PDF
How Elixir helped us scale our Video User Profile Service for the Olympics
Emerson Macedo
 
PDF
QCon SP 2016 - Video Authorization: from chaos to 25ms response time
Emerson Macedo
 
PDF
Qcon Rio 2015 - Microservices
Emerson Macedo
 
PDF
Microservices Case: GloboTV e Globosat Play
Emerson Macedo
 
PDF
Secomp 2011 - Node.JS - Introdução
Emerson Macedo
 
PDF
Jogos com NodeJS e Browser - QCON SP 2011
Emerson Macedo
 
PDF
Javascript Orientado a Objetos - Fisl12
Emerson Macedo
 
PDF
1 encontro Node.JS Brasil
Emerson Macedo
 
PDF
BrazilJS - Node.JS Realtime Web Applications
Emerson Macedo
 
PDF
RubyMasters 2011 - Beyond Ruby with NodeJS
Emerson Macedo
 
PDF
Node.JS - Campus Party Brasil 2011
Emerson Macedo
 
PDF
Nodejs - A performance que eu sempre quis ter
Emerson Macedo
 
ElixirConf 2019 - 10M Monthly Ad Insertions with Phoenix and Broadway
Emerson Macedo
 
The Conf 2019 - Elixir - Emerson Macedo
Emerson Macedo
 
Wanna be a manager? Not today - QCon São Paulo 2019
Emerson Macedo
 
TheConf 2018 - How does your app behave when everything goes wrong
Emerson Macedo
 
DevConf OpenSanca 2018 - How does your application behaves when everything go...
Emerson Macedo
 
How your app behaves when everything goes wrong - Ruby Conf BR 2017
Emerson Macedo
 
Beyond your daily coding - The Conf Brazil 2017 Keynote
Emerson Macedo
 
CEJS 2016 - Please learn that shit
Emerson Macedo
 
How Elixir helped us scale our Video User Profile Service for the Olympics
Emerson Macedo
 
QCon SP 2016 - Video Authorization: from chaos to 25ms response time
Emerson Macedo
 
Qcon Rio 2015 - Microservices
Emerson Macedo
 
Microservices Case: GloboTV e Globosat Play
Emerson Macedo
 
Secomp 2011 - Node.JS - Introdução
Emerson Macedo
 
Jogos com NodeJS e Browser - QCON SP 2011
Emerson Macedo
 
Javascript Orientado a Objetos - Fisl12
Emerson Macedo
 
1 encontro Node.JS Brasil
Emerson Macedo
 
BrazilJS - Node.JS Realtime Web Applications
Emerson Macedo
 
RubyMasters 2011 - Beyond Ruby with NodeJS
Emerson Macedo
 
Node.JS - Campus Party Brasil 2011
Emerson Macedo
 
Nodejs - A performance que eu sempre quis ter
Emerson Macedo
 
Ad

DevInRio 2010 - NodeJS