2013-10-04 4 views
1

Я создаю очень простое приложение на стойке, поскольку я хочу, чтобы он выполнял очень специфическую задачу.Лучше ли создать новый экземпляр контроллера для каждого HTTP-запроса в приложении на стойке или использовать тот же экземпляр?

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.register на Controller.new.register)? который лучше использовать и почему?

Заранее спасибо

ответ

1

Накладные создания нового контроллера для каждого запроса, скорее всего не такой большой.

Если вы сохраняете состояние в контроллере (переменные экземпляра и т. Д.), И вы его повторно используете, вы можете столкнуться с проблемами параллелизма, такими как условия гонки или тупик при загрузке.

Если вы следите за тем, чтобы в вашем объекте контроллера не было состояния, вы можете его повторно использовать. Если для каждого запроса требуется какое-либо хранилище состояний, вам необходимо убедиться, что общие ресурсы синхронизированы по свойствам.

My 2c - создайте новый контроллер для каждого запроса, пока не сможете подтвердить, что у вас есть производительность от создания нового контроллера на запрос. Это проще, чище и менее подвержено странным ошибкам.

+0

Большое спасибо, иметь смысл. Я думаю, что стресс-тестирование может дать мне представление о производительности. Но я полностью согласен, новый контроллер на запрос проще и чище. –

+0

Я предполагаю, что GC очистит новые объекты, как только они закончат свою работу, я хочу, чтобы я мог проследить это чем-то вроде захвата сигнала, чтобы я мог проверить состояние объекта и когда он будет очищен, было бы здорово, если бы вы знали, как я должен это делать? –

+1

GC должен очищать объекты, когда они выходят за рамки. Я использую JRuby, поэтому я использую GC JVM, но я не могу себе представить, чтобы рубиновый GC оставил устаревшие объекты. – mcfinnigan

Смежные вопросы