Ruby IMAP IDLE concurrencia: ¿cómo abordarlo?

Estoy intentando crear una aplicación web (privada, por ahora) que utilizará conexiones IMAP IDLE para mostrar los correos electrónicos de las personas a medida que llegan.

Estoy teniendo dificultades para descubrir cómo hackear esto juntos y cómo encajaría con mi servidor Heroku RoR.

He escrito un script básico para conectarse a un servidor IMAP y estar inactivo, se parece a esto (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

Esto hará una conexión al servidor IMAP y comenzará a ralentí. Como puede ver, esto se está bloqueando con el bucle.

Me gustaría tener múltiples conexiones IMAP inactivas al mismo tiempo para mis usuarios. Inicialmente, solo quería poner cada uno de ellos en un hilo, así:

Thread.new do
  start_imap_idling(server, port, usessl, username, password)
end

Todavía no estoy tan afilado en los hilos, pero con esta solución todavía tendré que bloquear mi hilo principal para esperar los hilos. Entonces, si hago algo como:

User.each do |user|
  Thread.new do
    start_imap_idling(server, port, usessl, username, password)
  end
end

loop do
  # Wait
end

¿Eso funcionaría, pero no sin el bucle en la parte inferior para permitir que se ejecuten los hilos?

Mi pregunta es ¿cómo puedo fundir esto mejor con mi aplicación Ruby On Rails en Heroku? No puedo bloquear el hilo con ese último bucle, entonces, ¿cómo ejecuto esto? Otro servidor? Un dinamómetro más, ¿tal vez un trabajador? He estado leyendo un poco sobre Event Machine. ¿Podría esto resolver mi problema? De ser así, ¿cómo debo escribir esto?

Otra cosa es que me gustaría poder agregar nuevos clientes imap y eliminar los actuales sobre la marcha. ¿Cómo se vería eso? ¿Algo con una cola quizás?

¡Cualquier ayuda y comentario son muy apreciados!

Respuestas a la pregunta(1)

Su respuesta a la pregunta