1

我正在创建一个非常简单的基于机架的应用程序,因为我希望它完成一项非常具体的任务。

server.rb看起来像这样:

Path= File.expand_path("#{File.dirname __FILE__}/../../")

require "bundler/setup"
require "thin"
require "rack"

%w(parser auth controller).each do |file| 
  require "#{Path}/app/server/#{file}.rb"
end


builder = Rack::Builder.app do
  use Auth
  run Parser.new    
end

Rack::Handler::Thin.run(builder, :Port => 8080, :threaded => true)

parser.rb好像:

class Parser

  def initialize
    @controller = Controller.new
  end

  def call(env)
    req = Rack::Request.new(env).params
    res = Rack::Response.new
    res['Content-Type'] = "text/plain"

    command= req[:command]

    if command =~ /\A(register|r|subscribe|s)\z/i
      @controller.register     
    end


    res.write command
    res.finish 

  end
end

现在我的问题是,从设计的角度来看,是创建一个实例Controller并将其用于每个请求(如上面代码中的 Idid),还是为每个请求创建新的控制器实例(更改@controller.registerController.new.register)更好?哪个更好用,为什么?

提前致谢

4

1 回答 1

1

每个请求创建一个新控制器的开销可能不会那么大。

如果您将状态存储在控制器中(实例变量等)并重用它,您可能会遇到并发问题,例如在负载下的竞争条件或死锁。

如果您注意确保您的 Controller 对象不存储任何状态,则可以重用它。如果它对每个请求进行任何类型的状态存储,您将需要确保共享资源是属性同步的。

我的 2c - 每个请求创建一个新控制器,直到您可以确认每个请求创建一个新控制器会影响性能。它更简单,更清洁,并且不易出现奇怪的错误。

于 2013-10-04T07:53:29.313 回答