2011-11-25 1 views
1

나는 HTTP 웹 프록시와 비슷한 것을 쓰고 싶다. 나는 이것을 위해 Sinatra와 함께 Ruby를 사용하여 현재 탐색 중이다.Sinatra를 사용하여 웹 프록시 구축, I/O 차단 처리? (+ 이상한 Heroku 요청 동시성 문제)

내 주요 관심사 중 하나는 내가 다른 서버에 보내는 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"를 사용하여이 항목을 로컬로 실행하면/slow 액세스는/fast 액세스를 방해하지 않습니다. 그러나, 내가 Heroku에 배포하면 갑자기/fast 요청은 요청이 완료 될 때까지 기다릴 것입니다. 로컬 및 Heroku에서이 앱이 단일 스레드 Thin에서 실행되고 있다고 생각했습니다. 나는 왜 내가 다른 행동을하는지 이해할 수 없다.

나는이 모든 것에 매우 익숙하다. 왜 내가이 일관성없는 행동을 경험하고 있습니까? 내가하려는 일을 성취하는 좋은 방법은 무엇일까요?

감사합니다.

+0

로컬로 단일 프로세스를 실행하고 있습니까? heroku에서 설명하는 동작은 내가 기대하는 것입니다. 즉, heroku 앱에 하나의 dyno 만 있으면됩니다. 어쨌든 비 차단 요청의 경우 http://rubyeventmachine.com/을 살펴 보거나 루비를 신경 쓰지 않는 것이 좋습니다. http://nodejs.org/ – leonardoborges

답변

1

요청을 실행 한 후 "ruby hello.rb"명령을 실행하면 Thin 웹 서버가 종료되지만 heroku는 웹 서버에서 루비 스레드를 활성 상태로 유지하므로 HTTP 요청에 더 많은 시간을 할애 할 수 있습니다.

thin start (서버에 thin을 설치 한 경우 현재 디렉토리에 config.ru가 있는지 확인하십시오.) 결과로 heroku가 표시됩니다.

+0

감사합니다. "얇은 시작"을 실행하면 나에게 Heroku와 같은 동작을 얻습니다. 감사. 내가 이해할 수없는 것은 : "루비 hello.rb"는 무엇을하고 있는가? (그것은 분명히 "씬 스타트"와 같지 않지만 사실 그것이 무엇인지 이해하지 못한다.) – Ming

+0

"얇은 시작"은 hello.rb 스크립트가 살아있는 웹 서버를 부팅합니다. 웹 서버가 다운 될 때까지 (Ctrl + C),'ruby hellp.rb'가 실행되고 대신 종료됩니다. – coolesting