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

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

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

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

hello.rb:

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", доступ / замедление не помешает доступу / быстрое. Однако, если я развернусь в Heroku, то внезапно запросы к / fast будут ждать, пока запросы к / slow не будут завершены. Я думал, что и локально, и на Heroku, это приложение работает на однопоточном Thin. Я не могу понять, почему у меня другое поведение.

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

Спасибо!

1 Ответ

1 голос
/ 25 ноября 2011

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

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

...