RabbitMQ с EventMachine и Rails - PullRequest
       32

RabbitMQ с EventMachine и Rails

2 голосов
/ 01 апреля 2012

В настоящее время мы планируем приложение rails 3.2.2, в котором мы используем RabbitMQ. Мы хотели бы запустить несколько видов рабочих (и несколько экземпляров рабочего) для обработки сообщений из разных очередей. Рабочие написаны на ruby ​​и лежат в каталоге lib приложения rails.

Некоторым работникам нужна структура рельсов (активная запись, активная модель ...), а некоторым - нет. Первый работник должен вызываться каждую минуту, чтобы проверить, доступны ли обновления. Другие работники должны обрабатывать сообщения из своих очередей, когда присутствуют сообщения (отправленные первым работником), и выполнять с ними некоторые (трудоемкие) действия.

Пока все хорошо. Моя проблема в том, что у меня мало опыта работы с системами обмена сообщениями, такими как RabbitMQ, и нет опыта взаимодействия между ними. Поэтому мне интересно, каковы лучшие практики, чтобы заставить двоих играть друг с другом. Вот мои требования снова:

  • Приложение Rails 3.2.2
  • RabbitMQ
  • Несколько рабочих
  • Несколько экземпляров одного работника
  • Контроль количества рабочих вне рельсов
  • Рабочие выполняют трудоемкие задачи, поэтому они должны быть асинхронными
  • Только несколько рабочих нуждаются в каркасе рельсов. Другие - просто рубиновые файлы с некоторыми зависимостями, такими как Net или File

Я искал какое-то решение и предложил две возможности:

Использование amqp с EventMachine в новом потоке

Конечно, я не хочу, чтобы мое приложение rails блокировалось при создании нового работника. Рабочий должен работать в другом потоке и выполнять свою работу асинхронно. И более того, он не должен запускать новый экземпляр моего приложения rails. Это должно требовать только того, что нужно работнику.

Но в некоторых статьях говорится, что с пассажиром есть некоторые проблемы. И еще один факт, который мне не нравится, это то, что мы используем веб-кирпичик для разработки, и мы должны включить обходные пути для этого тоже. Можно было бы переключиться на другой веб-сервер, например тонкий, но у меня тоже нет с этим никакого опыта.

Использование какого-либо вида демонизации

Возможно, можно запускать рабочих в качестве демона, но я не знаю, сколько это потребует, или как я могу контролировать количество рабочих.

Надеюсь, кто-то может посоветовать хорошее решение для этого (и я надеюсь, что я дал понять;)

Ответы [ 2 ]

1 голос
/ 15 апреля 2012

Мне кажется, что AMQP - большой шанс убить вашу проблему.Вы пытались использовать Resque?База данных Redis с резервной копией имеет несколько полезных функций (таких как публикация / подписка и всплывающие списки блокировки), которые делают ее очень интересной в качестве очереди сообщений, а Resque очень прост в использовании в любом приложении Rails.

Рабочие демонизированы, и вы сами решаете, какой сотрудник вашего пула слушает какую очередь, поэтому вы можете масштабировать каждый тип работы по мере необходимости.

Использование реактора EM внутри цикла запрос / ответне рекомендуется, потому что это может конфликтовать с существующим циклом событий (например, если ваше приложение обслуживается тонким), в любом случае вам нужно настроить его специально для вашего веб-сервера, для OTOS может быть интересно иметь потребителя четных очередей, если ваши задания имеют блокирующий ввод-вывод и не привязаны к процессору.

Если вы все еще хотите сделать это с AMQP, см. Запуск цикла событий и подключение в веб-приложениях и настройка для вашеговеб-сервер соответственно.Или используйте bunny для синхронного добавления в очередь (и любого потребителя работы, которого вы считаете нужным, например, работающего)

0 голосов
/ 27 июня 2012

мы работаем немного по-другому - но схожий технологический стек.

комплект демонов используется для системы обработки событий ... не рельсы, а общие модели (mongomapper & mongodb).EM вытягивает сообщения из очередей и выполняет всю необходимую логику (в миксе у нас есть правило, но работает и то, и другое).

mulesoft ESB - это наш внешний получатель и отправитель сообщений, которыепомогает нам иметь дело с миром HL7 / MLLP.Но в v1 приложения мы использовали некоторый java-код в ActiveMQ для управления сообщениями HL7.

Затем приложение rails просто предоставляет материал для просмотра пользователю - опять же, используя общие модели.

...