Я создаю очень простое приложение на стойке, поскольку я хочу, чтобы он выполнял очень специфическую задачу.Лучше ли создать новый экземпляр контроллера для каждого 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
)? который лучше использовать и почему?
Заранее спасибо
Большое спасибо, иметь смысл. Я думаю, что стресс-тестирование может дать мне представление о производительности. Но я полностью согласен, новый контроллер на запрос проще и чище. –
Я предполагаю, что GC очистит новые объекты, как только они закончат свою работу, я хочу, чтобы я мог проследить это чем-то вроде захвата сигнала, чтобы я мог проверить состояние объекта и когда он будет очищен, было бы здорово, если бы вы знали, как я должен это делать? –
GC должен очищать объекты, когда они выходят за рамки. Я использую JRuby, поэтому я использую GC JVM, но я не могу себе представить, чтобы рубиновый GC оставил устаревшие объекты. – mcfinnigan