Beyond
With
#whoami
#ruby
I
Ruby
class Product < ActiveRecord::Base
after_create :set_initial_inventory
has_many :variants, :dependent => :destroy
has_many...
“Tornar as coisas
simples fáceis e as
coisas difíceis possíveis”
Fisolofia Ruby
Código Bonito
Código Bonito
Don’t RepeatYourself
Código Bonito
Don’t RepeatYourself
Convention Over Configuration
class Booking < ActiveRecord::Base
belongs_to :hotel
belongs_to :user
validates_presence_of :hotel
validates_presence_of :...
#números
2010
~ 2 bilhões de
usuários de internet
em todo mundo
68 milhões de usuários
68 milhões de usuários
37 milhões são ativos
0
22,5
45
67,5
90
Brasil Italia Espanha Japão EUA Inglaterra França AustráliaAlemanha Suiça
59 %
63 %
72 %73 %74 %74 %75 %...
2014
~ 70% dos adultos
serão usuários
regulares de
redes sociais
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
Escalando DB na horizontal
write
read
write write
read
Escalando DB na horizontal
Shard
Database
Shard
Database
Shard
Database
Shard
Database
Shard
Database
Shard
Database
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
HTTP POST
Por que então mais
uma tecnologia ?
Escalando na horizontal
Escalando na horizontal
Evented, non-blocking I/O
GoogleV8 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
Ruby on Rails
HTTPD Database
Ruby on Rails
HTTPD Database
Ruby on Rails
HTTPD Database
Ruby on Rails
HTTPD
RUBY
PROCESS
Database
Ruby on Rails
HTTPD
RUBY
PROCESS
Database
BLOCK
Ruby on Rails
HTTPD
RUBY
PROCESS
RUBY
PROCESS
RUBY
PROCESS
EUBY
PROCESS
Database
BLOCK
BLOCK
BLOCK
BLOCK
Java
HTTPD Database
Servlet Container
Servlet
Java
HTTPD Database
Servlet Container
Servlet
Java
HTTPD Database
Servlet Container
Servlet
Java
HTTPD Database
Servlet Container
Thread
Servlet
Java
HTTPD Database
Servlet Container
Thread
Servlet
BLOCK
Java
HTTPD Database
Servlet Container
Thread
Thread
Thread
Thread
Thread
Thread
Thread
Servlet
BLOCK
BLOCK
BLOCK
BLOCK
BLO...
Apenas um processo
abrindo uma thread
para cada request
Produtividade do
programador mais que
performance da
tecnologia
Java Rumble ?!?
:p
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 ?
Apache vs NGINX
concurrency × reqs/sec
http://blog.webfaction.com/a-little-holiday-present
concurrency × reqs/sec
http://b...
Apache vs NGINX
concurrency × memory
http://blog.webfaction.com/a-little-holiday-present
concurrency × reqs/sec
http://blo...
Apache cria uma
thread por request
Troca de contexto
entre theads tem
um custo
Cada OS Thread
cria uma pilha de
execução nova
Pense bem antes de
usar uma thread por
request quando
precisar suportar alta
concorrência
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
Evite threads
Pattern para atender
alta concorrência
Evite threads
Use um Event Loop
Performance
!=
Escalabilidade
Performance
!=
Escalabilidade
mas ...
Uma performance
melhor ajuda a escalar
com menos recursos
Precisamos fazer I/O
de outra maneira
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
Latência de I/O
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 não bloqueante
I/O bloqueante
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
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 ?
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
Arquitetura
event
loop
(libev)
thread
pool
(libeio)
V8
Node Bindings
Node standard libraryJavascript
C
#reactor
ev_loop()
Pilha de execução
I/O em disco (bloqueante)
ev_loop()
socket_readdable(1)
Pilha de execução
I/O em disco (bloqueante)
ev_loop()
socket_readdable(1)
http_parse(1)
Pilha de execução
I/O em disco (bloqueante)
ev_loop()
socket_readdable(1)
http_parse(1)
Pilha de execução
load(“index.html”)
I/O em disco (bloqueante)
ev_loop()
socket_readdable(1)
http_parse(1)
Pilha de execução
I/O em disco (bloqueante)
ev_loop()
socket_readdable(1)
Pilha de execução
I/O em disco (bloqueante)
ev_loop()
Pilha de execução
I/O em disco (bloqueante)
ev_loop()
Pilha de execução
I/O em RAM (não bloqueante)
ev_loop()
socket_readdable(2)
Pilha de execução
I/O em RAM (não bloqueante)
ev_loop()
socket_readdable(2)
http_parse(2)
Pilha de execução
I/O em RAM (não bloqueante)
ev_loop()
socket_readdable(2)
http_parse(2)
Pilha de execução
http_respond(2)
I/O em RAM (não bloqueante)
ev_loop()
socket_readdable(2)
http_parse(2)
Pilha de execução
I/O em RAM (não bloqueante)
ev_loop()
socket_readdable(2)
Pilha de execução
I/O em RAM (não bloqueante)
ev_loop()
Pilha de execução
I/O em RAM (não bloqueante)
ev_loop()
Pilha de execução
Arquivo carregou do disco
ev_loop()
file_loaded()
Pilha de execução
Arquivo carregou do disco
ev_loop()
file_loaded()
http_respond(1)
Pilha de execução
Arquivo carregou do disco
ev_loop()
file_loaded()
Pilha de execução
Arquivo carregou do disco
ev_loop()
Pilha de execução
Arquivo carregou do disco
Arquitetura Web
Arquitetura Web
Nginx
Arquitetura Web
Ruby
on
Rails
Ruby
on
Rails
Ruby
on
Rails
Ruby
on
Rails
Ruby
on
Rails
Nginx
Arquitetura Web
Ruby
on
Rails
Ruby
on
Rails
Ruby
on
Rails
Ruby
on
Rails
Ruby
on
Rails
Nginx
NodeJS
Arquitetura Web
Nginx
#bizarrices
Isso é bonito?
em-syslog
em-spec
em-dns
em-syslog
em-proxy
em-spec
em-dns
em-syslog
em-ruby-irc
em-memcache-client
em-mysql
em-proxy
em-syncrony
em-spec
em-dns
em-syslog
em-ruby-irc
em-mongo
em-memcache-client em-simplechat
em-mysql
em-http-request em-websocket
em-proxy
em-syncrony
em-redis
em-spec
em-ftpd
em-dns
em-jabberbot
em-resolv-replace
...
EM-*
WS-*
#simplicidade
Código bloqueante
Código bloqueante
Código não-bloqueante
Callback
Callback
Callback
#evolução
Don’t RepeatYourself
XML
Properties
YAML
Configurações
XML
Properties
YAML
Configurações
JSON
Transporte
Configurações
JSON
Configurações
JSON
Configurações
JSON
Transporte
Configurações
Javascript Object Notation
Transporte
Java Ruby Python
Server Side
PHP
Java Ruby Python
Server Side
PHP
Client Side
JavaScript
Server Side
JavaScript
Server Side
JavaScript
Server Side
JavaScript
Client Side
#ecossistema
Sinatra detected !
TDD / BDD
TDD / BDD
#http://github.com/visionmedia/expresso/
TDD / BDD
#vows - http://vowsjs.org/
#last-thing
on
Client Ruby on Rails
Client Ruby on Rails
Servidor em Node.js
Servidor em Node.js
Código Client-Side ( JS )
Código Client-Side ( JS )
Código Server Coffeescript
#conclusão
I
Ruby
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.sourceforg...
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Próximos SlideShares
Carregando em…5
×

Beyond Ruby with NodeJS - RubyConf Brasil 2010

3.627 visualizações

Publicada em

Nessa apresentação eu descrevo o quanto eu gosto do Ruby e do Rails, mas onde ele pode não ser a melhor opção. NodeJS é uma tecnologia de certa forma recente, mas que pode cobrir algumas lacunas que o Ruby e Rails não fazem tão bem.

Publicada em: Tecnologia
0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.627
No SlideShare
0
A partir de incorporações
0
Número de incorporações
193
Ações
Compartilhamentos
0
Downloads
53
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Beyond Ruby with NodeJS - RubyConf Brasil 2010

  1. 1. Beyond With
  2. 2. #whoami
  3. 3. #ruby
  4. 4. I Ruby
  5. 5. 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 end Model Friday, August 7, 2009
  6. 6. “Tornar as coisas simples fáceis e as coisas difíceis possíveis” Fisolofia Ruby
  7. 7. Código Bonito
  8. 8. Código Bonito Don’t RepeatYourself
  9. 9. Código Bonito Don’t RepeatYourself Convention 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})" end end
  11. 11. #números
  12. 12. 2010
  13. 13. ~ 2 bilhões de usuários de internet em todo mundo
  14. 14. 68 milhões de usuários
  15. 15. 68 milhões de usuários 37 milhões são ativos
  16. 16. 0 22,5 45 67,5 90 Brasil Italia Espanha Japão EUA Inglaterra França AustráliaAlemanha Suiça 59 % 63 % 72 %73 %74 %74 %75 % 77 %78 % 86 % % de usuários ativos nas Redes Sociais Fonte:The Nielsen Company
  17. 17. 2014
  18. 18. ~ 70% dos adultos serão usuários regulares de redes sociais
  19. 19. Estrutura física de servidores para escalar
  20. 20. Escalando na vertical
  21. 21. Escalando na vertical
  22. 22. Escalando na horizontal
  23. 23. Escalando na horizontal
  24. 24. Escalando na horizontal
  25. 25. Escalando na horizontal
  26. 26. Escalando DB na horizontal write read write write read
  27. 27. Escalando DB na horizontal Shard Database Shard Database Shard Database Shard Database Shard Database Shard Database
  28. 28. Arquitetura pra fazer o software escalar
  29. 29. Pattern para atender muitos requests
  30. 30. Pattern para atender muitos requests Finalize a requisição o mais rápido possível
  31. 31. HTTP GET
  32. 32. HTTP POST
  33. 33. Por que então mais uma tecnologia ?
  34. 34. Escalando na horizontal
  35. 35. Escalando na horizontal
  36. 36. Evented, non-blocking I/O GoogleV8 Engine
  37. 37. Qual é o problema das tecnologias atuais ?
  38. 38. Como manter conectados 10, 20 ou 30 mil usuários simultâneos ?
  39. 39. Nosso código costuma ser escrito assim
  40. 40. Nosso código costuma ser escrito assim O que o software está fazendo enquanto a querie executa ?
  41. 41. Na maioria dos casos está travado esperando a resposta
  42. 42. Ruby on Rails HTTPD Database
  43. 43. Ruby on Rails HTTPD Database
  44. 44. Ruby on Rails HTTPD Database
  45. 45. Ruby on Rails HTTPD RUBY PROCESS Database
  46. 46. Ruby on Rails HTTPD RUBY PROCESS Database BLOCK
  47. 47. Ruby on Rails HTTPD RUBY PROCESS RUBY PROCESS RUBY PROCESS EUBY PROCESS Database BLOCK BLOCK BLOCK BLOCK
  48. 48. Java HTTPD Database Servlet Container Servlet
  49. 49. Java HTTPD Database Servlet Container Servlet
  50. 50. Java HTTPD Database Servlet Container Servlet
  51. 51. Java HTTPD Database Servlet Container Thread Servlet
  52. 52. Java HTTPD Database Servlet Container Thread Servlet BLOCK
  53. 53. Java HTTPD Database Servlet Container Thread Thread Thread Thread Thread Thread Thread Servlet BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK
  54. 54. Apenas um processo abrindo uma thread para cada request
  55. 55. Produtividade do programador mais que performance da tecnologia
  56. 56. Java Rumble ?!? :p
  57. 57. Apenas um processo abrindo uma thread para cada request
  58. 58. Parece bom mas ...
  59. 59. Como manter conectados 10, 20 ou 30 mil usuários simultâneos ?
  60. 60. Como manter conectados 10, 20 ou 30 mil usuários simultâneos ? 30 mil threads ?
  61. 61. Apache vs NGINX concurrency × reqs/sec http://blog.webfaction.com/a-little-holiday-present concurrency × reqs/sec http://blog.webfaction.com/a-little-holiday-present
  62. 62. Apache vs NGINX concurrency × memory http://blog.webfaction.com/a-little-holiday-present concurrency × reqs/sec http://blog.webfaction.com/a-little-holiday-present
  63. 63. Apache cria uma thread por request
  64. 64. Troca de contexto entre theads tem um custo
  65. 65. Cada OS Thread cria uma pilha de execução nova
  66. 66. Pense bem antes de usar uma thread por request quando precisar suportar alta concorrência
  67. 67. Pattern para atender muitos requests Finalize 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 threads Use um Event Loop
  71. 71. Performance != Escalabilidade
  72. 72. Performance != Escalabilidade mas ...
  73. 73. Uma performance melhor ajuda a escalar com menos recursos
  74. 74. Precisamos fazer I/O de outra maneira
  75. 75. Latência de I/O
  76. 76. L1 3 ciclos Latência de I/O
  77. 77. L1 3 ciclos L2 14 ciclos Latência de I/O
  78. 78. L1 3 ciclos L2 14 ciclos RAM 250 ciclos Latência de I/O
  79. 79. L1 3 ciclos L2 14 ciclos RAM 250 ciclos Disco 41.000.000 ciclos Latência de I/O
  80. 80. L1 3 ciclos L2 14 ciclos RAM 250 ciclos Disco 41.000.000 ciclos Rede 240.000.000 ciclos Latência de I/O
  81. 81. L1 3 ciclos L2 14 ciclos RAM 250 ciclos Disco 41.000.000 ciclos Rede 240.000.000 ciclos Latência de I/O
  82. 82. I/O não bloqueante
  83. 83. L1 3 ciclos L2 14 ciclos RAM 250 ciclos I/O não bloqueante
  84. 84. L1 3 ciclos L2 14 ciclos RAM 250 ciclos I/O não bloqueante I/O bloqueante
  85. 85. 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
  86. 86. Infraestrutura não bloqueante, puramente baseada em eventos, para desenvolver software de alta concorrência
  87. 87. Servidor TCP simples em NodeJS O código acima faz com que a execução retorne imediatamente ao event loop
  88. 88. Por que já não faziamos 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ão permite query async
  91. 91. Filosofia do NodeJS
  92. 92. Filosofia do NodeJS Todo I/O deveria ser feito desta forma
  93. 93. Arquitetura event loop (libev) thread pool (libeio) V8 Node Bindings Node standard libraryJavascript C
  94. 94. #reactor
  95. 95. ev_loop() Pilha de execução I/O em disco (bloqueante)
  96. 96. ev_loop() socket_readdable(1) Pilha de execução I/O em disco (bloqueante)
  97. 97. ev_loop() socket_readdable(1) http_parse(1) Pilha de execução I/O em disco (bloqueante)
  98. 98. ev_loop() socket_readdable(1) http_parse(1) Pilha de execução load(“index.html”) I/O em disco (bloqueante)
  99. 99. ev_loop() socket_readdable(1) http_parse(1) Pilha de execução I/O em disco (bloqueante)
  100. 100. ev_loop() socket_readdable(1) Pilha de execução I/O em disco (bloqueante)
  101. 101. ev_loop() Pilha de execução I/O em disco (bloqueante)
  102. 102. ev_loop() Pilha de execução I/O em RAM (não bloqueante)
  103. 103. ev_loop() socket_readdable(2) Pilha de execução I/O em RAM (não bloqueante)
  104. 104. ev_loop() socket_readdable(2) http_parse(2) Pilha de execução I/O em RAM (não bloqueante)
  105. 105. ev_loop() socket_readdable(2) http_parse(2) Pilha de execução http_respond(2) I/O em RAM (não bloqueante)
  106. 106. ev_loop() socket_readdable(2) http_parse(2) Pilha de execução I/O em RAM (não bloqueante)
  107. 107. ev_loop() socket_readdable(2) Pilha de execução I/O em RAM (não bloqueante)
  108. 108. ev_loop() Pilha de execução I/O em RAM (não bloqueante)
  109. 109. ev_loop() Pilha de execução Arquivo carregou do disco
  110. 110. ev_loop() file_loaded() Pilha de execução Arquivo carregou do disco
  111. 111. ev_loop() file_loaded() http_respond(1) Pilha de execução Arquivo carregou do disco
  112. 112. ev_loop() file_loaded() Pilha de execução Arquivo carregou do disco
  113. 113. ev_loop() Pilha de execução Arquivo carregou do disco
  114. 114. Arquitetura Web
  115. 115. Arquitetura Web Nginx
  116. 116. Arquitetura Web Ruby on Rails Ruby on Rails Ruby on Rails Ruby on Rails Ruby on Rails Nginx
  117. 117. Arquitetura Web Ruby on Rails Ruby on Rails Ruby on Rails Ruby on Rails Ruby on Rails Nginx NodeJS
  118. 118. Arquitetura Web Nginx
  119. 119. #bizarrices
  120. 120. Isso é bonito?
  121. 121. em-syslog
  122. 122. em-spec em-dns em-syslog
  123. 123. em-proxy em-spec em-dns em-syslog em-ruby-irc em-memcache-client
  124. 124. em-mysql em-proxy em-syncrony em-spec em-dns em-syslog em-ruby-irc em-mongo em-memcache-client em-simplechat
  125. 125. em-mysql em-http-request em-websocket em-proxy em-syncrony em-redis em-spec em-ftpd em-dns em-jabberbot em-resolv-replace em-syslog em-dir-watcher em-ruby-irc em-net-http em-s3 em-mongo em-memcache-client em-simplechat
  126. 126. EM-*
  127. 127. WS-*
  128. 128. #simplicidade
  129. 129. Código bloqueante
  130. 130. Código bloqueante Código não-bloqueante
  131. 131. Callback
  132. 132. Callback Callback
  133. 133. #evolução
  134. 134. Don’t RepeatYourself
  135. 135. XML Properties YAML Configurações
  136. 136. XML Properties YAML Configurações JSON Transporte
  137. 137. Configurações JSON
  138. 138. Configurações JSON
  139. 139. Configurações JSON Transporte
  140. 140. Configurações Javascript Object Notation Transporte
  141. 141. Java Ruby Python Server Side PHP
  142. 142. Java Ruby Python Server Side PHP Client Side JavaScript
  143. 143. Server Side JavaScript
  144. 144. Server Side JavaScript
  145. 145. Server Side JavaScript Client Side
  146. 146. #ecossistema
  147. 147. Sinatra detected !
  148. 148. TDD / BDD
  149. 149. TDD / BDD #http://github.com/visionmedia/expresso/
  150. 150. TDD / BDD #vows - http://vowsjs.org/
  151. 151. #last-thing
  152. 152. on
  153. 153. Client Ruby on Rails
  154. 154. Client Ruby on Rails
  155. 155. Servidor em Node.js
  156. 156. Servidor em Node.js
  157. 157. Código Client-Side ( JS )
  158. 158. Código Client-Side ( JS )
  159. 159. Código Server Coffeescript
  160. 160. #conclusão
  161. 161. I Ruby
  162. 162. Obrigado !!! Emerson Macedo @emerleite http://nodecasts.org http://codificando.com
  163. 163. 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

×