Использование Sinatra для создания веб-прокси, обработка блокировки ввода-вывода? (+ Странная проблема параллелизма запросов Heroku)

Я хочу написать что-то похожее на веб-прокси HTTP. В настоящее время я изучаю использование Ruby с Sinatra для этого.

Одно из моих главных опасений в связи с этим заключается в том, что HTTP-запрос, который я отправляю на другой сервер, может занять некоторое время, чтобы вернуться. Как убедиться, что я могу продолжать обслуживать другие запросы в то же время?

Я создал крайне надуманный пример, имитирующий такую ​​блокировку.

привет.рб:

require 'rubygems'
require 'sinatra'

set :server, 'thin'

get '/fast' do
    'Fast Hello World!'
end

get '/slow' do
    sleep 10 
    'Slow Hello World!'
end

config.ru:

require './hello'
run Sinatra::Application

Что меня совсем сбило с толку, так это то. Если я запущу это локально с помощью «ruby hello.rb», доступ к /slow не помешает доступу к /fast. Однако, если я развернусь на Heroku, то внезапно запросы к /fast будут ждать завершения запросов к /slow. Я думал, что и локально, и на Heroku это приложение работает на однопоточном Thin. Я не могу понять, почему я получаю другое поведение.

Я новичок во всем этом. Почему я испытываю такое непоследовательное поведение? Что было бы хорошим способом выполнить то, что я пытаюсь сделать?

Спасибо!


person Ming    schedule 25.11.2011    source источник
comment
Вы уверены, что запускаете один процесс локально? Поведение, которое вы описываете в героку, - это то, что я ожидал - при условии, что ваше приложение героку имеет только один динамометр. В любом случае, для неблокирующих запросов вы, возможно, захотите взглянуть на rubyeventmachine.com или, если вы этого не сделаете, мне не нужен ruby, nodejs.org   -  person leonardoborges    schedule 25.11.2011


Ответы (1)


Потому что команда «ruby hello.rb» выключит веб-сервер тонкого после того, как вы запустите запрос, но heroku сохранит ваш рубиновый поток на веб-сервере, поэтому вы можете попробовать больше времени с HTTP-запросом.

Вы можете сделать это с помощью этого thin start (убедитесь, что в вашем текущем каталоге есть config.ru), если вы установили тонкий сервер, вы увидите результат как heroku.

person coolesting    schedule 25.11.2011
comment
Спасибо. Бег с тонким стартом приводит к тому же поведению, что и к Heroku. Спасибо. Тогда я не могу понять: что делает ruby ​​hello.rb? (Очевидно, это не то же самое, что тонкий старт, но я боюсь, что не понимаю, что это такое на самом деле.) - person Ming; 26.11.2011
comment
Отличие заключается в том, что тонкий запуск загружает веб-сервер, который поддерживает сценарий hello.rb в процессе до тех пор, пока веб-сервер не остановится (Ctrl + C), а ruby hellp.rb просто запускается, а затем немедленно выключается. - person coolesting; 28.11.2011