Sinatraを使用してWebプロキシを構築すると、I/Oブロッキングを処理できますか? (+奇妙なHeroku要求の並行性の問題)

私はHTTPのWebプロキシに似た何かを書こうと思っています。私は現在、SinatraでRubyを使ってこれを調べています。

私の主な心配の1つは、私が別のサーバに行う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"を使って実行すると、access/slowはアクセス/高速化を妨げません。しかし、私がHerokuにデプロイすると、突然、/ fastへのリクエストは、リクエストが完了するまで/遅くなるのを待ちます。私はローカルでもHerokuでも、このアプリはシングルスレッドのThinで動作していると思っていました。私はなぜ違う行動を取るのか理解できません。

私はこのすべてにかなり新しいです。なぜ私はこの矛盾した行動を経験していますか?私がしようとしていることを達成するための良い方法は何でしょうか?

ありがとう!

1
ローカルで単一のプロセスを実行していますか?あなたがherokuで説明している動作は、あなたのherokuアプリに1つのdynoしかないなら、私が期待するものです。いずれの場合でも、非ブロッキングリクエストの場合は、 ruby​​eventmachine.com をご覧になるか、ルビーの世話、 nodejs.org
追加された 著者 leonardoborges,

1 答え

コマンド "ruby hello.rb"は要求を実行した後にthinのWebサーバーをシャットダウンするので、herokuはWebサーバー上であなたのルビースレッドを有効に保つので、HTTPリクエストでもっと時間を取ることができます。

あなたは、この thin start (あなたの現在のディレクトリにconfig.ruがあることを確認してください)のようにサーバをインストールした場合、herokuとして結果が表示されます。

1
追加された
異なったのは、 "シン・スタート"は、Webサーバーを起動してhello.rbスクリプトをWebサーバーがダウンするまで(Ctrl + C)、プロセスの中で生きているようにします。むしろ ruby​​ hellp.rb 次に、シャットダウンする。
追加された 著者 coolesting,
ありがとう。 "薄いスタート"を実行すると、私はHerokuと同じ動作をします。ありがとう。私が理解できないのは、「ru​​by hello.rb」とは何ですか? (それは明らかに "薄いスタート"と同じではありませんが、私は実際に何が分かっていないのでしょうか?)
追加された 著者 Ming,