Асинхронные вызовы методов с Ruby, как с Ajax

Я работаю с XMPP, и у меня есть обратный вызов сообщения, который активируется при каждой отправке сообщения. Моя цель - отправить данные, поступающие по сообщению, в API в обратном вызове и на основе ответа отправить что-то обратно с помощью клиента XMPP.

  1. Сообщение типа пользователя (клиент чата в браузере)
  2. Сообщение поступает на сервер через XMPP
  3. Сообщение отправляется в API
  4. Получен ответ
  5. Ответ отправляется обратно клиенту чата.

Мой код для этого выглядит следующим образом

admin_muc_client.activate_message_callbacks do |m|            
  sender    = m.from.resource
  room_slug = m.from.node
  message   = m.body                  

  r = HTTParty.get('http://example.com/api/v1/query?msg=message')
  Rails.logger.debug(r.inspect)
  admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin'
end

Меня беспокоит то, что, поскольку обратный вызов выполнен и запрос к API будет блокирующим вызовом, это может стать узким местом для всего приложения. Я бы предпочел использовать что-то вроде AJAX для Javascript, который запускал бы запрос и отправлял бы данные, когда доступен ответ. Как я могу реализовать это в Ruby?

Я рассмотрел delayed_job и backgroundrb, которые выглядят как инструменты для операций «запустить и забыть». Мне понадобится что-то, что активирует обратный вызов асинхронно с ответом.

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

5
задан Sid 11 November 2011 в 06:50
поделиться