Повторные входящие подзапросы в Rack / Rails - PullRequest
0 голосов
/ 30 октября 2009

У меня есть пара плагинов Engine с металлическими оконечными точками, которые реализуют некоторые чрезвычайно простые веб-сервисы, которые я собираюсь использовать в нескольких приложениях. Они работают так же хорошо, как и сейчас, но, очевидно, при загрузке их локально для разработки и тестирования, отправка Net :: HTTP сообщения get_response с просьбой к localhost запросить другую страницу изнутри выполняющегося в данный момент объекта контроллера приводит к мгновенной взаимоблокировке.

Таким образом, мой вопрос заключается в том, предоставляет ли система маршрутизации Rails (или Rack) способ безопасного использования веб-службы, которая может входить или не входить в состав одного и того же приложения на одном экземпляре сервера, или мне придется взламывать специальный случай вместе с render_to_string для тех случаев, когда имя хоста в URI совпадает с моим собственным?

Ответы [ 2 ]

3 голосов
/ 03 ноября 2009

Он не работает в разработке, потому что он обслуживает только один запрос за раз, и запрос контроллера застревает. Если вам это нужно, вы можете запустить несколько серверов локально за балансировщиком нагрузки. Я рекомендую использовать Passenger даже для разработки (и предустановку , если вы используете OS X).

Моя рекомендация для вас - разделить внутренние веб-сервисы и приложения, которые их используют. Таким образом, вы не дублируете код и можете легко масштабировать и контролировать их по отдельности.

0 голосов
/ 05 июня 2015

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

Действительно простое промежуточное программное обеспечение Rentrant может работать следующим образом:

class Reentry < Struct.new(:app)
  def call(env)
    @current_env = env
    app.call(env.merge('reentry' => self)
  end

  def call_rack(request_uri)
    env_for_recursive_call = @current_env.dup
    env_for_recursive_call['PATH_INFO'] = request_uri # ...and more
    status, headers, response = call(env_for_recursive_call)
    # for example, return response as a String
    response.inject(''){|part, buf| part + buf }
  end
end

Тогда в коде вызова:

env['reentry'].call_rack('/my/api/get-json')

Очень правильным вариантом использования для этого является загрузка ответов API в JSON. формат на главной странице.

Очевидно, что успех этой техники будет зависеть от сложности вашего стека Rack (так как некоторые части Rack env не любят повторного использования).

...