взаимодействие между процессами ruby

#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.