В настоящее время мы планируем приложение rails 3.2.2, в котором мы используем RabbitMQ. Мы хотели бы запустить несколько видов рабочих (и несколько экземпляров рабочего) для обработки сообщений из разных очередей. Рабочие написаны на ruby и лежат в каталоге lib приложения rails.
Некоторым работникам нужна структура рельсов (активная запись, активная модель ...), а некоторым - нет. Первый работник должен вызываться каждую минуту, чтобы проверить, доступны ли обновления. Другие работники должны обрабатывать сообщения из своих очередей, когда присутствуют сообщения (отправленные первым работником), и выполнять с ними некоторые (трудоемкие) действия.
Пока все хорошо. Моя проблема в том, что у меня мало опыта работы с системами обмена сообщениями, такими как RabbitMQ, и нет опыта взаимодействия между ними. Поэтому мне интересно, каковы лучшие практики, чтобы заставить двоих играть друг с другом. Вот мои требования снова:
- Приложение Rails 3.2.2
- RabbitMQ
- Несколько рабочих
- Несколько экземпляров одного работника
- Контроль количества рабочих вне рельсов
- Рабочие выполняют трудоемкие задачи, поэтому они должны быть асинхронными
- Только несколько рабочих нуждаются в каркасе рельсов. Другие - просто рубиновые файлы с некоторыми зависимостями, такими как Net или File
Я искал какое-то решение и предложил две возможности:
Использование amqp с EventMachine в новом потоке
Конечно, я не хочу, чтобы мое приложение rails блокировалось при создании нового работника. Рабочий должен работать в другом потоке и выполнять свою работу асинхронно. И более того, он не должен запускать новый экземпляр моего приложения rails. Это должно требовать только того, что нужно работнику.
Но в некоторых статьях говорится, что с пассажиром есть некоторые проблемы. И еще один факт, который мне не нравится, это то, что мы используем веб-кирпичик для разработки, и мы должны включить обходные пути для этого тоже. Можно было бы переключиться на другой веб-сервер, например тонкий, но у меня тоже нет с этим никакого опыта.
Использование какого-либо вида демонизации
Возможно, можно запускать рабочих в качестве демона, но я не знаю, сколько это потребует, или как я могу контролировать количество рабочих.
Надеюсь, кто-то может посоветовать хорошее решение для этого (и я надеюсь, что я дал понять;)