[ruby] rack简介

花花公子 2009-02-24
主页 http://rack.rubyforge.org/
安装方式 gem install rack

样例代码: infinity.ru
infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, env.inspect]}
use Rack::CommonLogger
use Rack::ShowExceptions

map '/' do
  run infinity
end

map '/version' do
  map '/' do
    run Proc.new {|env| [200, {"Content-Type" => "text/html"}, "infinity 0.1"] }
  end

  map '/last' do
    run Proc.new {|env| [200, {"Content-Type" => "text/html"}, Rack::Request.new(env).params.inspect] }
  end
end


执行: rackup infinity.ru -p 3000
然后用浏览器访问 http://localhost:3000
http://localhost:3000/version
http://localhost:3000/version/last
花花公子 2009-02-24
评价:

rack目前是我web开发的首选,当然它太简单。没有O/R Mapping,没有View层。当然同时它也没有script/server, script/generate这些负担。

但是rack本身就是作为中间件存在的,更复杂的应用应该考虑sinatra,下一步我会展示一些sinatra的特性。
CharlesCui 2009-03-24
有必要说明下你用在什么场景下,不是单纯简单就好的。

如果想追求处理速度,是否可以用别的语言的中间件?ruby语言的中间件再快,当一个请求阻塞住,其它的请求就只能等待,因为它的线程是假的。所以rack和其它ruby中间件即便再快,也只是理想情况,当一个请求的阻塞发生时,一切请求处理都完蛋。
花花公子 2009-03-24
一个请求堵塞住,我们还有其他线程接受请求呢。
别的语言的中间件不推荐,Ruby语言和其他语言的互操作性并不好。换句话说,所有的语言和别的语言的互操作性都不好。
CharlesCui 2009-03-24
ruby线程是假的,你不行你试试在一个rails的控制器的方法里写一个带条件的sleep,发一个sleep的请求过去,再发一个同一个控制器方法处理的请求过去,看看第二个会不会被第一个sleep的请求堵塞住。

结果是会的,所以ruby这个动态语言的线程是假的,所以用ruby实现的中间件要非常谨慎,说不定一个请求堵塞了,其它请求只能排队了,而不像别的语言可以另起线程处理,ruby只有一个主进程,进程堵塞了,新线程无法建立。

花花,要搞高并发,ruby真的不行。当然我也希望它行。
花花公子 2009-03-24
说错了,是多进程模型。一个进程当然只能接受一个请求了。
虽然ruby在1.8自身的线程是绿色线程,但是你可以去看看eventmachine库,这个库可以支持epoll操作,应该是用线程实现的。
robbin 2009-03-26
说实话讨厌rack,rack的fastcgi支持有bug,不但有bug,而且高负载下面不稳定,这个问题不解决,我们就没有办法升级rails
花花公子 2009-03-26
robbin请试试这个

http://github.com/rack/rack-contrib/tree/master

引用
Rack::LighttpdScriptNameFix - Fixes how lighttpd sets the SCRIPT_NAME and PATH_INFO variables in certain configurations.

robbin 2009-03-26
你的意思是用最新版本的rack来替代rails2.3的rack试试看?
花花公子 2009-03-26
rack-contrib相当于rack的插件,可以当作rack中间件使用的,和rack并不是直接的关系。其中的修复lighttpd参数的中间件我觉得可能会起到作用。
Global site tag (gtag.js) - Google Analytics