Ruby simultaneidade IMAP IDLE - como enfrentar?
Estou tentando criar um aplicativo Web (privado, por enquanto) que utilizará conexões IMAP IDLE para mostrar os e-mails das pessoas assim que chegare
Estou tendo dificuldade em descobrir como invadir isso juntos - e como ele se encaixaria no meu servidor Heroku RoR.
Eu escrevi um script básico para conectar a um servidor IMAP e ocioso, parece algo assim (simplificado):
imap = Net::IMAP.new server, port, usessl
imap.login username, password
imap.select "INBOX"
imap.add_response_handler do |response|
if resp.kind_of(Net::IMAP::UntaggedResponse) && resp.name == "EXISTS"
# New mail recieved. Ping back and process.
end
end
imap.idle
loop do
sleep 10*60
imap.renew_idle
end
Isto fará uma conexão com o servidor IMAP e começará a inatividade. Como você vê, isso está bloqueando o loop.
Gostaria de ter várias conexões IMAP ociosas ao mesmo tempo para meus usuários. Inicialmente, eu só queria colocar cada um deles em um thread, assim:
Thread.new do
start_imap_idling(server, port, usessl, username, password)
end
Ainda não sou tão afiado em threads, mas com esta solução ainda terei que bloquear meu thread principal para aguardar os threads? Então, se eu fizer algo como:
User.each do |user|
Thread.new do
start_imap_idling(server, port, usessl, username, password)
end
end
loop do
# Wait
end
Isso funcionaria, mas não sem o loop na parte inferior para permitir a execução dos thread
Minha pergunta é como melhor derretê-lo com meu aplicativo Ruby On Rails no Heroku? Não posso estar bloqueando o thread com esse último loop - então como faço para executar isso? Outro servidor? Um dinamômetro mais - talvez um trabalhador? Eu tenho lido um pouco sobre a Event Machine - isso poderia resolver meu problema? Se sim, como devo escrever isso?
Outra coisa é que eu gostaria de poder adicionar novos clientes imap e remover os atuais em tempo real. Como isso pode parecer? Algo com uma fila, talvez?
Qualquer ajuda e comentários são muito apreciado