RubyMasters 2011 - Beyond Ruby with NodeJS

4,591 views
4,508 views

Published on

Palestra online feita na RubyMasters Conf 2011

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,591
On SlideShare
0
From Embeds
0
Number of Embeds
1,872
Actions
Shares
0
Downloads
44
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

RubyMasters 2011 - Beyond Ruby with NodeJS

  1. 1. BeyondWith
  2. 2. #whoami
  3. 3. #ruby
  4. 4. IRuby
  5. 5. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink endFriday, August 7, 2009
  6. 6. “Tornar as coisas simples fáceis e ascoisas difíceis possíveis” Fisolofia Ruby
  7. 7. Código Bonito
  8. 8. Código BonitoDon’t Repeat Yourself
  9. 9. Código Bonito Don’t Repeat YourselfConvention Over Configuration
  10. 10. class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend
  11. 11. #números
  12. 12. 2010
  13. 13. ~ 2 bilhões deusuários de internet em todo mundo
  14. 14. 68 milhões de usuários
  15. 15. 68 milhões de usuários37 milhões são ativos
  16. 16. Usuários de Internet no Mundo (em milhões) 2.000 milhões200015001000 500 360 milhões 0 2000 2010
  17. 17. Usuários de Internet no Brasil (em milhões) 70 milhões 7052,5 3517,5 10 milhões 0 2000 2010
  18. 18. % de usuários ativos nas Redes Sociais 90 86 % 78 % 77 % 75 % 74 % 74 % 73 % 72 %67,5 63 % 59 % 4522,5 0 Brasil Italia Espanha Japão EUA Inglaterra França Austrália Alemanha Suiça Fonte: The Nielsen Company
  19. 19. 2014
  20. 20. ~ 70% dos adultos serão usuários regulares de redes sociais
  21. 21. Estrutura física deservidores para escalar
  22. 22. Escalando na vertical
  23. 23. Escalando na vertical
  24. 24. Escalando na horizontal
  25. 25. Escalando na horizontal
  26. 26. Escalando na horizontal
  27. 27. Escalando na horizontal
  28. 28. Escalando DB na horizontal re ad ad re write write write
  29. 29. Escalando DB na horizontal Shard Shard Shard Shard Shard ShardDatabase Database Database Database Database Database
  30. 30. Arquitetura pra fazer o software escalar
  31. 31. Pattern para atender muitos requests
  32. 32. Pattern para atender muitos requestsFinalize a requisição o mais rápido possível
  33. 33. HTTP GET
  34. 34. HTTP POST
  35. 35. Por que então mais uma tecnologia ?
  36. 36. Escalando na horizontal
  37. 37. Escalando na horizontal
  38. 38. Qual é o problemadas tecnologias atuais ?
  39. 39. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ?
  40. 40. Nosso código costuma ser escrito assim
  41. 41. Nosso código costuma ser escrito assimO que o software está fazendo enquanto a querie executa ?
  42. 42. Na maioria dos casosestá travado esperando a resposta
  43. 43. Ruby on RailsHTTPD Database
  44. 44. Ruby on RailsHTTPD Database
  45. 45. Ruby on RailsHTTPD Database
  46. 46. Ruby on Rails RUBY PROCESSHTTPD Database
  47. 47. Ruby on Rails RUBY BLOCK PROCESSHTTPD Database
  48. 48. Ruby on Rails RUBY BLOCK PROCESS RUBY BLOCK PROCESSHTTPD Database RUBY BLOCK PROCESS EUBY PROCESS BLOCK
  49. 49. Java Servlet ContainerHTTPD Servlet Database
  50. 50. Java Servlet ContainerHTTPD Servlet Database
  51. 51. Java Servlet ContainerHTTPD Servlet Database
  52. 52. Java Servlet Container ThreadHTTPD Servlet Database
  53. 53. Java Servlet Container Thread BLOCKHTTPD Servlet Database
  54. 54. Java Servlet Container Thread BLOCK Thread BLOCK Thread BLOCKHTTPD Servlet Database Thread BLOCK Thread BLOCK Thread BLOCK Thread BLOCK
  55. 55. Apenas um processoabrindo uma thread para cada request
  56. 56. Produtividade doprogramador mais que performance da tecnologia
  57. 57. Apenas um processoabrindo uma thread para cada request
  58. 58. Parece bom mas ...
  59. 59. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ?
  60. 60. Como manterconectados 10, 20 ou 30 mil usuários simultâneos ? 30 mil threads ?
  61. 61. concurrency × reqs/sec Apache vs NGINX concurrency × reqs/sec http://blog.webfaction.com/a-little-holiday-presenthttp://blog.webfaction.com/a-little-holiday-present
  62. 62. concurrency × reqs/sec Apache vs NGINX concurrency × memory http://blog.webfaction.com/a-little-holiday-presenthttp://blog.webfaction.com/a-little-holiday-present
  63. 63. Apache cria umathread por request
  64. 64. Troca de contextoentre theads tem um custo
  65. 65. Cada OS Threadcria uma pilha de execução nova
  66. 66. Pense bem antes deusar uma thread por request quandoprecisar suportar alta concorrência
  67. 67. Pattern para atender muitos requestsFinalize a requisição o mais rápido possível
  68. 68. Pattern para atender alta concorrência
  69. 69. Pattern para atender alta concorrência Evite threads
  70. 70. Pattern para atender alta concorrência Evite threadsUse um Event Loop
  71. 71. Performance !=Escalabilidade
  72. 72. Performance !=Escalabilidade mas ...
  73. 73. Uma performancemelhor ajuda a escalarcom menos recursos
  74. 74. Precisamos fazer I/O de outra maneira
  75. 75. Latência de I/O
  76. 76. Latência de I/OL1 3 ciclos
  77. 77. Latência de I/OL1 3 ciclosL2 14 ciclos
  78. 78. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclos
  79. 79. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclos
  80. 80. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclosRede 240.000.000 ciclos
  81. 81. Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclosRede 240.000.000 ciclos
  82. 82. I/O não bloqueante
  83. 83. I/O não bloqueante L1 3 ciclos L2 14 ciclosRAM 250 ciclos
  84. 84. I/O não bloqueante L1 3 ciclos L2 14 ciclosRAM 250 ciclos I/O bloqueante
  85. 85. I/O não bloqueante L1 3 ciclos L2 14 ciclosRAM 250 ciclos I/O bloqueanteDisco 41.000.000 ciclosRede 240.000.000 ciclos
  86. 86. Infraestrutura não bloqueante, puramente baseada em eventos, para desenvolver software de alta concorrência
  87. 87. Servidor TCP simples em NodeJSO código acima faz com que a execução retorne imediatamente ao event loop
  88. 88. Por que já nãofaziamos dessa forma ?
  89. 89. POSIX Assync I/O não suportado por todos os S.Os
  90. 90. POSIX Assync I/O não suportado por todos os S.Os libmysql_client nãopermite query async
  91. 91. Filosofia do NodeJS
  92. 92. Filosofia do NodeJSTodo I/O deveria ser feito desta forma
  93. 93. ArquiteturaJavascript Node standard library C Node Bindings thread event pool loop V8 (libeio) (libev)
  94. 94. #reactor
  95. 95. Pilha de execução ev_loop() I/O em disco (bloqueante)
  96. 96. Pilha de execução socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  97. 97. Pilha de execução http_parse(1) socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  98. 98. Pilha de execução load(“index.html”) http_parse(1) socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  99. 99. Pilha de execução http_parse(1) socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  100. 100. Pilha de execução socket_readdable(1) ev_loop() I/O em disco (bloqueante)
  101. 101. Pilha de execução ev_loop() I/O em disco (bloqueante)
  102. 102. Pilha de execução ev_loop() I/O em RAM (não bloqueante)
  103. 103. Pilha de execução socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  104. 104. Pilha de execução http_parse(2) socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  105. 105. Pilha de execução http_respond(2) http_parse(2) socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  106. 106. Pilha de execução http_parse(2) socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  107. 107. Pilha de execução socket_readdable(2) ev_loop() I/O em RAM (não bloqueante)
  108. 108. Pilha de execução ev_loop() I/O em RAM (não bloqueante)
  109. 109. Pilha de execução ev_loop() Arquivo carregou do disco
  110. 110. Pilha de execução file_loaded() ev_loop() Arquivo carregou do disco
  111. 111. Pilha de execução http_respond(1) file_loaded() ev_loop() Arquivo carregou do disco
  112. 112. Pilha de execução file_loaded() ev_loop() Arquivo carregou do disco
  113. 113. Pilha de execução ev_loop() Arquivo carregou do disco
  114. 114. Arquitetura Web
  115. 115. Arquitetura Web Nginx
  116. 116. Arquitetura Web NginxRuby Ruby Ruby Ruby Ruby on on on on onRails Rails Rails Rails Rails
  117. 117. Arquitetura Web NginxRuby Ruby Ruby Ruby Ruby on on on on on NodeJSRails Rails Rails Rails Rails
  118. 118. Arquitetura Web Nginx
  119. 119. Arquitetura Web Nginx NodeJS
  120. 120. Arquitetura Web NodeJS
  121. 121. #bizarrices
  122. 122. Isso é bonito?
  123. 123. em-syslog
  124. 124. em-dns em-syslogem-spec
  125. 125. em-proxy em-dns em-syslog em-ruby-ircem-spec em-memcache-client
  126. 126. em-mysql em-proxy em-dns em-mongoem-syncrony em-syslog em-ruby-irc em-spec em-memcache-client em-simplechat
  127. 127. em-mysql em-resolv-replace em-http-request em-websocket em-proxy em-dns em-s3 em-mongoem-syncrony em-syslog em-dir-watcher em-ftpd em-jabberbot em-redis em-ruby-irc em-spec em-net-http em-memcache-client em-simplechat
  128. 128. EM-*
  129. 129. WS-*
  130. 130. #simplicidade
  131. 131. Código bloqueante
  132. 132. Código bloqueanteCódigo não-bloqueante
  133. 133. Callback
  134. 134. CallbackCallback
  135. 135. #evolução
  136. 136. Don’t Repeat Yourself
  137. 137. Configurações PropertiesXML YAML
  138. 138. Configurações PropertiesXML YAML JSON Transporte
  139. 139. Configurações JSON
  140. 140. Configurações JSON
  141. 141. Configurações JSON Transporte
  142. 142. ConfiguraçõesJavascript Object Notation Transporte
  143. 143. Server SideJava Ruby Python PHP
  144. 144. Server SideJava Ruby Python PHP Client Side JavaScript
  145. 145. Server Side JavaScript
  146. 146. Server Side JavaScript
  147. 147. Server Side JavaScriptClient Side
  148. 148. #ecossistema
  149. 149. Sinatra detected !
  150. 150. Testes Automatizados
  151. 151. Testes Automatizados#https://github.com/caolan/nodeunit
  152. 152. #LIVE
  153. 153. on
  154. 154. Client Ruby on Rails
  155. 155. Client Ruby on Rails
  156. 156. Servidor em Node.js
  157. 157. Servidor em Node.js
  158. 158. Código Client-Side ( JS )
  159. 159. Código Client-Side ( JS )
  160. 160. Código Server Coffeescript
  161. 161. #conclusão
  162. 162. IRuby
  163. 163. Obrigado !!! Emerson Macedo @emerleite http://nodecasts.org http://codificando.com

×