使用Sinatra构建Web代理,处理I / O阻塞? (+奇怪的Heroku请求并发问题)

时间:2011-11-25 04:20:48

标签: ruby concurrency heroku sinatra thin

我想写一些类似于HTTP Web代理的东西。我目前正在探索将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”运行它,访问/ slow将不会干扰访问/快速。但是,如果我部署到Heroku,那么突然,对/ fast的请求将等待请求/缓慢完成。我曾经想过本地和Heroku,这个应用程序运行在单线程Thin。我无法理解为什么我会有不同的行为。

我对这一切都很陌生。为什么我会遇到这种不一致的行为?什么是完成我想要做的好方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

因为命令“ruby hello.rb”会在您运行请求后关闭瘦服务器,但是heroku会使您的ruby线程在Web服务器上保持活动状态,因此您可以尝试使用HTTP请求更多时间。 / p>

你可以使用这个thin start(确保你当前的目录有config.ru),如果你已经安装了瘦服务器,你会看到结果是heroku。