SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
Event Machine
                       I/O não bloqueante escalável em Ruby




Friday, August 5, 11
Sobre Mim

                • Wilker Lúcio
                • Consultor para Kajabi (Ruby on Rails)
                • http://github.com/wilkerlucio
                • @wilkerlucio
                • wilkerlucio@gmail.com


Friday, August 5, 11
Problema C10K




Friday, August 5, 11
O que é Event Machine?



                • Implementação da “design pattern” Reactor
                       • Similar a Node (Javascript) ou Twisted (Python)




Friday, August 5, 11
Quem usa Event Machine?

                • Engine Yard
                • Heroku
                • Github
                • Campfire
                • ...


Friday, August 5, 11
O que é I/O?
                • Arquivos
                • Network
                       • respostas de query mysql
                       • respostas http
                       • respostas memcache
                • A maioria das aplicações web são ligadas a I/O e
                       não a CPU


Friday, August 5, 11
Um simples servidor TCP

       TCPSocket#read*
       bloqueia




       Solução comum: usar
       uma thread por cliente



Friday, August 5, 11
I/O não bloqueante


          Alternativa para Threads:
          simplesmente não bloqueie!




Friday, August 5, 11
O que é o Reactor?


                • Reactor é simplesmente um loop while single
                       thread, chamado de “loop reactor”

                • Seu código “reage” a eventos
                • Se seu evento demora muito para ser tratado,
                       outros eventos não podem ocorrer durante esse
                       período




Friday, August 5, 11
Lição: NUNCA bloqueie o
                           reactor!

                • Não use sleep(x)
                • Não faça loops demorados (100_000.times)
                • Não use I/O bloqueante (queries em database)
                • Não faça pooling (while !condição)



Friday, August 5, 11
Escrevendo código assíncrono
        Código síncrono usa retorno de valores:



        Eventos async usam blocos de código:


        Diferente de blocos comuns, os blocos de eventos são
        gravados para serem invocados futuramente:




Friday, August 5, 11
Demo - Chat com
                EventMachine + WebSockets




Friday, August 5, 11
Experimento - MiniWar




Friday, August 5, 11
Fibers



                • Goliath
                • EM-Synchrony




Friday, August 5, 11
Obrigado!




Friday, August 5, 11

Contenu connexe

Plus de Frevo on Rails

Introducao a Ruby on Rails
Introducao a Ruby on RailsIntroducao a Ruby on Rails
Introducao a Ruby on Rails
Frevo on Rails
 
Programação GUI com jRuby
Programação GUI com jRubyProgramação GUI com jRuby
Programação GUI com jRuby
Frevo on Rails
 
The elements of User Experience
The elements of User ExperienceThe elements of User Experience
The elements of User Experience
Frevo on Rails
 

Plus de Frevo on Rails (13)

Introducao a Ruby on Rails
Introducao a Ruby on RailsIntroducao a Ruby on Rails
Introducao a Ruby on Rails
 
Programação GUI com jRuby
Programação GUI com jRubyProgramação GUI com jRuby
Programação GUI com jRuby
 
awesome_nested_fields
awesome_nested_fieldsawesome_nested_fields
awesome_nested_fields
 
WebApps minimalistas com Sinatra
WebApps minimalistas com SinatraWebApps minimalistas com Sinatra
WebApps minimalistas com Sinatra
 
The elements of User Experience
The elements of User ExperienceThe elements of User Experience
The elements of User Experience
 
Crash Course Ruby & Rails
Crash Course Ruby & RailsCrash Course Ruby & Rails
Crash Course Ruby & Rails
 
jcheck: validações client-side sem dores
jcheck: validações client-side sem doresjcheck: validações client-side sem dores
jcheck: validações client-side sem dores
 
Ruby (nem tão) Básico
Ruby (nem tão) BásicoRuby (nem tão) Básico
Ruby (nem tão) Básico
 
Perfil da Comunidade
Perfil da ComunidadePerfil da Comunidade
Perfil da Comunidade
 
Resolvendo problemas de dependências com o Bundler
Resolvendo problemas de dependências com o BundlerResolvendo problemas de dependências com o Bundler
Resolvendo problemas de dependências com o Bundler
 
O que vem por aí com Rails 3
O que vem por aí com Rails 3O que vem por aí com Rails 3
O que vem por aí com Rails 3
 
Introdução a Ruby
Introdução a RubyIntrodução a Ruby
Introdução a Ruby
 
Regras do Coding Dojo
Regras do Coding DojoRegras do Coding Dojo
Regras do Coding Dojo
 

Dernier

Dernier (8)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 

Event machine

  • 1. Event Machine I/O não bloqueante escalável em Ruby Friday, August 5, 11
  • 2. Sobre Mim • Wilker Lúcio • Consultor para Kajabi (Ruby on Rails) • http://github.com/wilkerlucio • @wilkerlucio • wilkerlucio@gmail.com Friday, August 5, 11
  • 4. O que é Event Machine? • Implementação da “design pattern” Reactor • Similar a Node (Javascript) ou Twisted (Python) Friday, August 5, 11
  • 5. Quem usa Event Machine? • Engine Yard • Heroku • Github • Campfire • ... Friday, August 5, 11
  • 6. O que é I/O? • Arquivos • Network • respostas de query mysql • respostas http • respostas memcache • A maioria das aplicações web são ligadas a I/O e não a CPU Friday, August 5, 11
  • 7. Um simples servidor TCP TCPSocket#read* bloqueia Solução comum: usar uma thread por cliente Friday, August 5, 11
  • 8. I/O não bloqueante Alternativa para Threads: simplesmente não bloqueie! Friday, August 5, 11
  • 9. O que é o Reactor? • Reactor é simplesmente um loop while single thread, chamado de “loop reactor” • Seu código “reage” a eventos • Se seu evento demora muito para ser tratado, outros eventos não podem ocorrer durante esse período Friday, August 5, 11
  • 10. Lição: NUNCA bloqueie o reactor! • Não use sleep(x) • Não faça loops demorados (100_000.times) • Não use I/O bloqueante (queries em database) • Não faça pooling (while !condição) Friday, August 5, 11
  • 11. Escrevendo código assíncrono Código síncrono usa retorno de valores: Eventos async usam blocos de código: Diferente de blocos comuns, os blocos de eventos são gravados para serem invocados futuramente: Friday, August 5, 11
  • 12. Demo - Chat com EventMachine + WebSockets Friday, August 5, 11
  • 14. Fibers • Goliath • EM-Synchrony Friday, August 5, 11