Capus Party 2011            Emerson Macedo                @emerleite           http://nodecasts.org          http://codific...
#performance
2000
360 milhões deusuários de internet  em todo mundo
9,8 milhões de usuários
9,8 milhões de usuários4,8 milhões são ativos
2010
~ 2 bilhões deusuários de internet  em todo mundo
68 milhões de usuários
68 milhões de usuários37 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      1995Java EE   1998
PHP      1995Java EE   1998ASP.Net   2001
PHP         1995   Java EE      1998  ASP.Net       2001Ruby on Rails   2004
PHP         1995   Java EE      1998  ASP.Net       2001Ruby on Rails   2004   Django       2006
Por que então mais uma tecnologia ?
Usuários de Internet no Mundo (em milhões)                                      2.000 milhões200015001000 500     360 milh...
Usuários de Internet no Brasil (em milhões)                                        70 milhões 7052,5 3517,5         10 mil...
Mas já escalamos muito  bem nossos sites
Estrutura física deservidores para escalar
Escalando na vertical
Escalando na vertical
Escalando na horizontal
Escalando na horizontal
Escalando na horizontal
Escalando na horizontal
Escalando DB na horizontal                                   re                                      ad      ad   re      ...
Escalando DB na horizontal Shard      Shard      Shard      Shard      Shard      ShardDatabase   Database   Database   Da...
Arquitetura pra fazer o software escalar
Pattern para atender  muitos requests
Pattern para atender  muitos requestsFinalize 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
Evented, non-blocking I/O    Google V8 Engine
Qual é o problemadas tecnologias atuais ?
Como manterconectados 10, 20 ou   30 mil usuários    simultâneos ?
Nosso código costuma  ser escrito assim
Nosso código costuma  ser escrito assimO que o software está fazendo enquanto a querie executa ?
Na maioria dos casosestá 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      ...
Java           Servlet ContainerHTTPD          Servlet         Database
Java           Servlet ContainerHTTPD          Servlet         Database
Java           Servlet ContainerHTTPD          Servlet         Database
Java                  Servlet Container         ThreadHTTPD                 Servlet         Database
Java                  Servlet Container         Thread                 BLOCKHTTPD                 Servlet           Database
Java                  Servlet Container         Thread                 BLOCK         Thread                 BLOCK         ...
Apenas um processoabrindo uma thread para cada request
Produtividade doprogramador mais que   performance da      tecnologia
Apenas um processoabrindo uma thread para cada request
Parece bom mas ...
Como manterconectados 10, 20 ou   30 mil usuários    simultâneos ?
Como manterconectados 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-presenthttp://bl...
concurrency × reqs/sec Apache vs NGINX concurrency × memory  http://blog.webfaction.com/a-little-holiday-presenthttp://blo...
Apache cria umathread por request
Troca de contextoentre theads tem    um custo
Cada OS Threadcria uma pilha de execução nova
Pense bem antes deusar uma thread por   request quandoprecisar suportar alta    concorrência
Como manterconectados 10, 20 ou   30 mil usuários    simultâneos ?
Pattern para atender  muitos requestsFinalize 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 threadsUse um Event Loop
Performance     !=Escalabilidade
Performance     !=Escalabilidade  mas ...
Uma performancemelhor ajuda a escalarcom menos recursos
Precisamos fazer I/O de outra maneira
Latência de I/O
Latência de I/OL1          3 ciclos
Latência de I/OL1          3 ciclosL2          14 ciclos
Latência de I/O L1         3 ciclos L2         14 ciclosRAM        250 ciclos
Latência de I/O L1           3 ciclos L2           14 ciclosRAM          250 ciclosDisco     41.000.000 ciclos
Latência de I/O L1            3 ciclos L2            14 ciclosRAM           250 ciclosDisco      41.000.000 ciclosRede    ...
Latência de I/O L1            3 ciclos L2            14 ciclosRAM           250 ciclosDisco      41.000.000 ciclosRede    ...
I/O não bloqueante
I/O não bloqueante L1          3 ciclos L2          14 ciclosRAM         250 ciclos
I/O não bloqueante L1          3 ciclos L2          14 ciclosRAM         250 ciclos  I/O bloqueante
I/O não bloqueante L1           3 ciclos L2           14 ciclosRAM          250 ciclos   I/O bloqueanteDisco     41.000.00...
Infraestrutura não bloqueante, puramente  baseada em eventos, para desenvolver      software de alta concorrência
Servidor TCP simples      em NodeJSO código acima faz com que a execução retorne imediatamente ao event loop
Por que já nãofaziamos dessa forma ?
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ãopermite query async
Filosofia do NodeJS
Filosofia do NodeJSTodo I/O deveria ser feito desta forma
Para qualqueroperação que acesse o disco ou a rede deve  existir um callback
ArquiteturaJavascript   Node standard library    C             Node Bindings                    thread     event          ...
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...
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ã...
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  ...
Arquitetura Web                      Nginx Ruby     Ruby     Ruby        Ruby     Ruby  or       or       or          or  ...
Arquitetura Web      Nginx
Arquitetura Web      Nginx      NodeJS
Arquitetura Web      NodeJS
Arquitetura Web                 NodeJSQuando NodeJS estiver bem maduro, aidéia de Ryan é que ele seja a porta de          ...
#simplicidade
Produtividade doprogramador mais que   performance da      tecnologia
Don’t Repeat Yourself
Configurações        PropertiesXML                  YAML
Configurações        PropertiesXML                  YAML          JSON       Transporte
Configurações    JSON
Configurações    JSON
Configurações    JSON Transporte
ConfiguraçõesJavascript Object Notation     Transporte
Server SideJava   Ruby   Python   PHP
Server SideJava   Ruby   Python   PHP       Client Side        JavaScript
Server Side JavaScript
Server Side JavaScript
Server Side JavaScriptClient Side
#ecossistema
Sinatra detected !
Test driven development#vows - http://vowsjs.org/
Test driven development
Test driven development#http://github.com/visionmedia/expresso/
#LIVE
Obrigado !!!    Emerson Macedo        @emerleite   http://nodecasts.org  http://codificando.com
Referênciashttp://www.internetworldstats.com/emarketing.htmhttp://en.wikipedia.org/wiki/Event_loophttp://lse.sourceforge.n...
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
Próximos SlideShares
Carregando em…5
×

Node.JS - Campus Party Brasil 2011

8.110 visualizações

Publicada em

Apresentação de Node.JS feita na Campus Party 2011.

Publicada em: Tecnologia
4 comentários
16 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
8.110
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2.697
Ações
Compartilhamentos
0
Downloads
153
Comentários
4
Gostaram
16
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Node.JS - Campus Party Brasil 2011

  1. 1. Capus Party 2011 Emerson Macedo @emerleite http://nodecasts.org http://codificando.com http://groups.google.com/group/nodebr
  2. 2. #performance
  3. 3. 2000
  4. 4. 360 milhões deusuários de internet em todo mundo
  5. 5. 9,8 milhões de usuários
  6. 6. 9,8 milhões de usuários4,8 milhões são ativos
  7. 7. 2010
  8. 8. ~ 2 bilhões deusuários de internet em todo mundo
  9. 9. 68 milhões de usuários
  10. 10. 68 milhões de usuários37 milhões são ativos
  11. 11. 2014
  12. 12. ~ 70% dos adultos serão usuários regulares de redes sociais
  13. 13. Tecnologias atuais
  14. 14. Todas essas tecnologias tem algo em comum
  15. 15. PHP 1995
  16. 16. PHP 1995Java EE 1998
  17. 17. PHP 1995Java EE 1998ASP.Net 2001
  18. 18. PHP 1995 Java EE 1998 ASP.Net 2001Ruby on Rails 2004
  19. 19. PHP 1995 Java EE 1998 ASP.Net 2001Ruby on Rails 2004 Django 2006
  20. 20. Por que então mais uma tecnologia ?
  21. 21. Usuários de Internet no Mundo (em milhões) 2.000 milhões200015001000 500 360 milhões 0 2000 2010
  22. 22. Usuários de Internet no Brasil (em milhões) 70 milhões 7052,5 3517,5 10 milhões 0 2000 2010
  23. 23. Mas já escalamos muito bem nossos sites
  24. 24. Estrutura física deservidores para escalar
  25. 25. Escalando na vertical
  26. 26. Escalando na vertical
  27. 27. Escalando na horizontal
  28. 28. Escalando na horizontal
  29. 29. Escalando na horizontal
  30. 30. Escalando na horizontal
  31. 31. Escalando DB na horizontal re ad ad re write write write
  32. 32. Escalando DB na horizontal Shard Shard Shard Shard Shard ShardDatabase Database Database Database Database Database
  33. 33. Arquitetura pra fazer o software escalar
  34. 34. Pattern para atender muitos requests
  35. 35. Pattern para atender muitos requestsFinalize a requisição o mais rápido possível
  36. 36. HTTP GET
  37. 37. HTTP POST
  38. 38. Por que então mais uma tecnologia ?
  39. 39. Escalando na horizontal
  40. 40. Escalando na horizontal
  41. 41. Evented, non-blocking I/O Google V8 Engine
  42. 42. Qual é o problemadas tecnologias atuais ?
  43. 43. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ?
  44. 44. Nosso código costuma ser escrito assim
  45. 45. Nosso código costuma ser escrito assimO que o software está fazendo enquanto a querie executa ?
  46. 46. Na maioria dos casosestá travado esperando a resposta
  47. 47. Rails ou Django HTTPD Database
  48. 48. Rails ou Django HTTPD Database
  49. 49. Rails ou Django HTTPD Database
  50. 50. Rails ou Django RUNTIME PROCESS HTTPD Database
  51. 51. Rails ou Django RUNTIME BLOCK PROCESS HTTPD Database
  52. 52. Rails ou Django RUNTIME BLOCK PROCESS RUNTIME BLOCK PROCESS HTTPD Database RUNTIME BLOCK PROCESS RUNTIME PROCESS BLOCK
  53. 53. Java Servlet ContainerHTTPD Servlet Database
  54. 54. Java Servlet ContainerHTTPD Servlet Database
  55. 55. Java Servlet ContainerHTTPD Servlet Database
  56. 56. Java Servlet Container ThreadHTTPD Servlet Database
  57. 57. Java Servlet Container Thread BLOCKHTTPD Servlet Database
  58. 58. Java Servlet Container Thread BLOCK Thread BLOCK Thread BLOCKHTTPD Servlet Database Thread BLOCK Thread BLOCK Thread BLOCK Thread BLOCK
  59. 59. Apenas um processoabrindo uma thread para cada request
  60. 60. Produtividade doprogramador mais que performance da tecnologia
  61. 61. Apenas um processoabrindo uma thread para cada request
  62. 62. Parece bom mas ...
  63. 63. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ?
  64. 64. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ? 30 mil threads ?
  65. 65. concurrency × reqs/sec Apache vs NGINX concurrency × reqs/sec http://blog.webfaction.com/a-little-holiday-presenthttp://blog.webfaction.com/a-little-holiday-present
  66. 66. concurrency × reqs/sec Apache vs NGINX concurrency × memory http://blog.webfaction.com/a-little-holiday-presenthttp://blog.webfaction.com/a-little-holiday-present
  67. 67. Apache cria umathread por request
  68. 68. Troca de contextoentre theads tem um custo
  69. 69. Cada OS Threadcria uma pilha de execução nova
  70. 70. Pense bem antes deusar uma thread por request quandoprecisar suportar alta concorrência
  71. 71. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ?
  72. 72. Pattern para atender muitos requestsFinalize a requisição o mais rápido possível
  73. 73. Pattern para atender alta concorrência
  74. 74. Pattern para atender alta concorrência Evite threads
  75. 75. Pattern para atender alta concorrência Evite threadsUse um Event Loop
  76. 76. Performance !=Escalabilidade
  77. 77. Performance !=Escalabilidade mas ...
  78. 78. Uma performancemelhor ajuda a escalarcom menos recursos
  79. 79. Precisamos fazer I/O de outra maneira
  80. 80. Latência de I/O
  81. 81. Latência de I/OL1 3 ciclos
  82. 82. Latência de I/OL1 3 ciclosL2 14 ciclos
  83. 83. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclos
  84. 84. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclos
  85. 85. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclosRede 240.000.000 ciclos
  86. 86. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclosRede 240.000.000 ciclos
  87. 87. I/O não bloqueante
  88. 88. I/O não bloqueante L1 3 ciclos L2 14 ciclosRAM 250 ciclos
  89. 89. I/O não bloqueante L1 3 ciclos L2 14 ciclosRAM 250 ciclos I/O bloqueante
  90. 90. I/O não bloqueante L1 3 ciclos L2 14 ciclosRAM 250 ciclos I/O bloqueanteDisco 41.000.000 ciclosRede 240.000.000 ciclos
  91. 91. Infraestrutura não bloqueante, puramente baseada em eventos, para desenvolver software de alta concorrência
  92. 92. Servidor TCP simples em NodeJSO código acima faz com que a execução retorne imediatamente ao event loop
  93. 93. Por que já nãofaziamos dessa forma ?
  94. 94. POSIX Assync I/O não suportado por todos os S.Os
  95. 95. POSIX Assync I/O não suportado por todos os S.Os libmysql_client nãopermite query async
  96. 96. Filosofia do NodeJS
  97. 97. Filosofia do NodeJSTodo I/O deveria ser feito desta forma
  98. 98. Para qualqueroperação que acesse o disco ou a rede deve existir um callback
  99. 99. ArquiteturaJavascript Node standard library C Node Bindings thread event pool loop V8 (libeio) (libev)
  100. 100. Pilha de execução ev_loop() I/O em disco (bloqueante)
  101. 101. Pilha de execução socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  102. 102. Pilha de execução http_parse(1) socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  103. 103. Pilha de execução load(“index.html”) http_parse(1) socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  104. 104. Pilha de execução http_parse(1) socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  105. 105. Pilha de execução socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  106. 106. Pilha de execução ev_loop() I/O em disco (bloqueante)
  107. 107. Pilha de execução ev_loop() I/O em RAM (não bloqueante)
  108. 108. Pilha de execução socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  109. 109. Pilha de execução http_parse(2) socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  110. 110. Pilha de execução http_respond(2) http_parse(2) socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  111. 111. Pilha de execução http_parse(2) socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  112. 112. Pilha de execução socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  113. 113. Pilha de execução ev_loop() I/O em RAM (não bloqueante)
  114. 114. Pilha de execução ev_loop() Arquivo carregou do disco
  115. 115. Pilha de execução file_loaded() ev_loop() Arquivo carregou do disco
  116. 116. Pilha de execução http_respond(1) file_loaded() ev_loop() Arquivo carregou do disco
  117. 117. Pilha de execução file_loaded() ev_loop() Arquivo carregou do disco
  118. 118. Pilha de execução ev_loop() Arquivo carregou do disco
  119. 119. Arquitetura Web
  120. 120. Arquitetura Web Nginx
  121. 121. Arquitetura Web Nginx Ruby Ruby Ruby Ruby Ruby or or or or orPython Python Python Python Python
  122. 122. Arquitetura Web Nginx Ruby Ruby Ruby Ruby Ruby or or or or or NodeJSPython Python Python Python Python
  123. 123. Arquitetura Web Nginx
  124. 124. Arquitetura Web Nginx NodeJS
  125. 125. Arquitetura Web NodeJS
  126. 126. Arquitetura Web NodeJSQuando NodeJS estiver bem maduro, aidéia de Ryan é que ele seja a porta de entrada. Será ?
  127. 127. #simplicidade
  128. 128. Produtividade doprogramador mais que performance da tecnologia
  129. 129. Don’t Repeat Yourself
  130. 130. Configurações PropertiesXML YAML
  131. 131. Configurações PropertiesXML YAML JSON Transporte
  132. 132. Configurações JSON
  133. 133. Configurações JSON
  134. 134. Configurações JSON Transporte
  135. 135. ConfiguraçõesJavascript Object Notation Transporte
  136. 136. Server SideJava Ruby Python PHP
  137. 137. Server SideJava Ruby Python PHP Client Side JavaScript
  138. 138. Server Side JavaScript
  139. 139. Server Side JavaScript
  140. 140. Server Side JavaScriptClient Side
  141. 141. #ecossistema
  142. 142. Sinatra detected !
  143. 143. Test driven development#vows - http://vowsjs.org/
  144. 144. Test driven development
  145. 145. Test driven development#http://github.com/visionmedia/expresso/
  146. 146. #LIVE
  147. 147. Obrigado !!! Emerson Macedo @emerleite http://nodecasts.org http://codificando.com
  148. 148. Referênciashttp://www.internetworldstats.com/emarketing.htmhttp://en.wikipedia.org/wiki/Event_loophttp://lse.sourceforge.net/io/aio.htmlhttp://code.google.com/p/v8/http://opengroup.org/onlinepubs/007908775/xsh/select.htmlhttp://en.wikipedia.org/wiki/Thread_pool_patternhttp://www.commonjs.org/specs/modules/1.0/http://en.wikipedia.org/wiki/File_descriptorhttp://en.wikipedia.org/wiki/Reactor_pattern

×