event machine
TRANSCRIPT
Event MachineI/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
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: usaruma 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íncronoCódigo síncrono usa retorno de valores:
Eventos async usam blocos de código:
Diferente de blocos comuns, os blocos de eventos sãogravados 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