RubyMasters 2011 - Beyond Ruby with NodeJS
Upcoming SlideShare
Loading in...5
×
 

RubyMasters 2011 - Beyond Ruby with NodeJS

on

  • 4,564 views

Palestra online feita na RubyMasters Conf 2011

Palestra online feita na RubyMasters Conf 2011

Statistics

Views

Total Views
4,564
Views on SlideShare
2,688
Embed Views
1,876

Actions

Likes
5
Downloads
43
Comments
0

9 Embeds 1,876

http://blog.egenial.com.br 1855
http://paper.li 10
http://us-w1.rockmelt.com 3
http://forum.rubyonbr.org 3
http://webcache.googleusercontent.com 1
http://www.infoblogs.com.br 1
http://www.plugmasters.com.br 1
http://coderwall.com 1
http://theoldreader.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

RubyMasters 2011 - Beyond Ruby with NodeJS RubyMasters 2011 - Beyond Ruby with NodeJS Presentation Transcript

  • BeyondWith
  • #whoami
  • #ruby
  • IRuby
  • 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
  • “Tornar as coisas simples fáceis e ascoisas difíceis possíveis” Fisolofia Ruby
  • Código Bonito
  • Código BonitoDon’t Repeat Yourself
  • Código Bonito Don’t Repeat YourselfConvention Over Configuration
  • 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
  • #números
  • 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
  • Usuários de Internet no Mundo (em milhões) 2.000 milhões200015001000 500 360 milhões 0 2000 2010
  • Usuários de Internet no Brasil (em milhões) 70 milhões 7052,5 3517,5 10 milhões 0 2000 2010
  • % 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
  • 2014
  • ~ 70% dos adultos serão usuários regulares de redes sociais
  • 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 write write write
  • Escalando DB na horizontal Shard Shard Shard Shard Shard ShardDatabase Database Database Database Database Database
  • 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
  • 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
  • Ruby on RailsHTTPD Database
  • Ruby on RailsHTTPD Database
  • Ruby on RailsHTTPD Database
  • Ruby on Rails RUBY PROCESSHTTPD Database
  • Ruby on Rails RUBY BLOCK PROCESSHTTPD Database
  • Ruby on Rails RUBY BLOCK PROCESS RUBY BLOCK PROCESSHTTPD Database RUBY BLOCK PROCESS EUBY PROCESS 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 Thread BLOCKHTTPD Servlet Database Thread BLOCK Thread BLOCK 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://blog.webfaction.com/a-little-holiday-present
  • concurrency × reqs/sec Apache vs NGINX concurrency × memory http://blog.webfaction.com/a-little-holiday-presenthttp://blog.webfaction.com/a-little-holiday-present
  • 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
  • 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 240.000.000 ciclos
  • Latência de I/O L1 3 ciclos L2 14 ciclosRAM 250 ciclosDisco 41.000.000 ciclosRede 240.000.000 ciclos
  • 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.000 ciclosRede 240.000.000 ciclos
  • 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
  • ArquiteturaJavascript Node standard library C Node Bindings thread event pool loop V8 (libeio) (libev)
  • #reactor
  • 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 NginxRuby Ruby Ruby Ruby Ruby on on on on onRails Rails Rails Rails Rails
  • Arquitetura Web NginxRuby Ruby Ruby Ruby Ruby on on on on on NodeJSRails Rails Rails Rails Rails
  • Arquitetura Web Nginx
  • Arquitetura Web Nginx NodeJS
  • Arquitetura Web NodeJS
  • #bizarrices
  • Isso é bonito?
  • em-syslog
  • em-dns em-syslogem-spec
  • em-proxy em-dns em-syslog em-ruby-ircem-spec em-memcache-client
  • em-mysql em-proxy em-dns em-mongoem-syncrony em-syslog em-ruby-irc em-spec em-memcache-client em-simplechat
  • 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
  • EM-*
  • WS-*
  • #simplicidade
  • Código bloqueante
  • Código bloqueanteCódigo não-bloqueante
  • Callback
  • CallbackCallback
  • #evolução
  • 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 !
  • Testes Automatizados
  • Testes Automatizados#https://github.com/caolan/nodeunit
  • #LIVE
  • 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
  • IRuby
  • Obrigado !!! Emerson Macedo @emerleite http://nodecasts.org http://codificando.com