Loop de evento de intervalo cronometrado em Ruby

Recentemente, tive a necessidade de escrever algum código que executasse ping em um serviço da web em um intervalo regular (tinha que ser muito preciso devido à limitação de taxa) e fazer uma ação definida com o resultado.

Para escrever isso, primeiro coloquei tudo em uma classe MyService,. Mas então tive que encontrar uma maneira de repetir essa funcionalidade a cada 5 segundos. No início, tentei Delayed::Job, mas não era muito preciso e iria engolir as tabelas do banco de dados com registros ao longo do tempo, à medida que injetava continuamente novas linhas. Não havia nada dinâmico na natureza, então fazia sentido usar outra tecnologia.

Em vez disso, escolho escrever um daemon usando a daemonsgema e, em seguida, uso a revbiblioteca para escrever um loop de evento.

Código completo disponível: https://gist.github.com/4276211

Isso me permite iniciar o serviço a partir da linha de comando e garantir que ele seja executado a cada 5 segundos.

$< cd rails_root RAILS_ENV=production script/scheduler restart

Você pode facilmente criar uma receita de capistrano para fazer isso para você ao reiniciar / iniciar / parar seu servidor, da mesma forma que você deve integrar Delayed::Jobem suas receitas.