Event Machine é uma biblioteca Ruby que permite I/O não bloqueante escalável através da implementação do padrão "Reactor". Ele usa um loop de eventos em uma única thread chamado "loop reactor" para reagir a eventos de forma assíncrona, evitando bloqueios. Empresas como Engine Yard, Heroku e Github usam Event Machine para escalar aplicações web que dependem muito de I/O.
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