#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
У меня есть проект Rails и два мини-демона ruby, работающих в фоновом режиме. Каков наилучший способ взаимодействия между ними?
Должно быть возможно взаимодействие, подобное приведенному ниже: Rails -> Процесс 1 -> Процесс 2 -> Rails
Некоторые запросы будут синхронизированы, другие — асинхронны.
Очереди (что-то вроде AMQ или пользовательских вызовов на основе Redis) или HTTP-вызовы RPC?
Ответ №1:
Проверьте также DRb.
Ответ №2:
Я внедрил систему с помощью RabbitMQ драгоценный камень bunny.
Обновить:
После прочтения http://blog.brightbox.co.uk/posts/queues-and-callbacks Я решил попробовать RabbitMQ. Есть два драгоценных камня: amqp (асинхронный, основанный на eventmachine) или bunny (синхронизация). amqp великолепен, но если вы используете Rails с passenger, он может делать некоторые странные вещи.
Система работает следующим образом, демоны прослушивают сообщения в очереди:
# The incoming data should be a JSON encoded hash that looks like:
# { "method" => method_to_call, "opts" => [ Array of opts for method ],
# "output" => "a queue where to send the result (optional)" }
# If output is specified it will publish the JSON encoded response there.
def listen_on(queue_name, class)
BUNNY.start
bunny = BUNNY.queue(queue_name)
bunny.subscribe do |msg|
msg = JSON.parse(msg[:payload])
result = class.new.send(msg["method"], *msg["opts"])
if msg["output"]
BUNNY.queue(msg["output"]).publish(result.to_json)
end
end
Таким образом, как только сообщение получено, оно вызывает метод из класса. Следует отметить одну вещь: было бы идеально использовать bunny для Rails и amqp в демонах. Но мне нравится использовать один из сервисов gem pe.
Комментарии:
1. @MB В интересах других, не могли бы вы поделиться более подробной информацией о вашем решении?
2. Если вы хотите использовать amqp с rails, вам следует проверить thin . Оно основано на машине событий, поэтому вы можете просто добавить свой код amqp, поскольку вы уже находитесь в цикле EM.