В свете того, что проект переписывается на Ruby, я бы посоветовал Вам обратить внимание на
Resque. Также есть альтернатива в виде
Sidekiq, которая может обеспечить более качественный уровень параллелизма за счет реального fork'a, так что начать я бы предложил все же с него.
Помимо предложенных выше решений, которые более специфичны для Ruby, можно использовать другой подход: поставить, например,
RabbitMQ — это брокер сообщений, написанный на Erlang. Схема работы с RabbitMQ, упрощенно, следующая:
есть очереди, находящиеся под контролем RabbitMQ; в эти очереди разные процессы могут записывать сообщения (например, по крону, запустили скрипт, который определил фронт работ, и разослал сообщения о работах по очередям); есть процессы, которые «слушают» определенную очередь, и когда в очередь поступает новое сообщение RabbitMQ выбирает один слушающий процесс и передает ему это сообщение (т.е. распределением сообщений в очереди по процессам занимается RabbitMQ).