Rails - 是为nginx / passenger

时间:2015-07-24 15:51:27

标签: ruby-on-rails nginx passenger instance

我已在Engineyardproduction环境中的staging部署了Rails应用。我很想知道我的应用的每个HTTP请求是否初始化了Rails App的新实例?

2 个答案:

答案 0 :(得分:2)

Rails是无状态的,这意味着对Rails应用程序的每个请求都有自己的环境和对该请求唯一的变量。因此,合格的"是",每个请求都会启动您应用的新实例 [1] ;您无法确定先前请求中发生的情况或同时发生的其他请求。但是,请记住,应用程序将由一组固定的工作人员提供服务。

在EY上使用Rails,您将运行像瘦服务器或独角兽一样的Web服务器。这将有一个确定数量的工人,让我们说5.每个工人一次只能处理一个请求,因为这是rails的工作方式。因此,如果您的请求每个需要200毫秒,这意味着您可以为每个工作人员每秒处理大约5个请求。如果一个请求需要很长时间(几秒钟),则该工作程序无法接受任何其他请求。通常不会在Engineyard上创建和删除工人;它们被设置并持续运行,直到你重新部署,但对于类似Heroku的东西,你的应用程序可能没有任何工作人员(dynos),如果没有请求进入它将不得不旋转。

<小时/> <子> [1]我定义实例,如应用程序类的新实例。每个模型和类都将被重新实例化,并且@request和@session从头开始构建。

答案 1 :(得分:0)

根据我的理解。 不,绝对不会为每个请求初始化新实例。然后可能会出现两个问题。

  • 多个用户如何在不受干扰的情况下同时登录和访问我的系统?
  • 即使一个用户占用了太多的处理时间,另一个用户又如何能够访问其他功能。

对第一个问题的回答是HTTP是无状态的,所有内容都存储在会话中,这是在cookie中,它位于客户机而不是服务器中。因此,当您为登录用户发送HTTP请求时,浏览器实际上会将具有所需凭据/用户信息的HTTP请求从客户端cookie发送到服务器,而无需用户知道。多个请求仅排队并相应地提供服务。由于我们的服务器非常快,我觉得它只是即时处理。

对于第二个查询,您可能可能是并发。您正在使用的服务器(nginx,passenger)可以同时提供多个请求。即使我们的服务器可能忙于特定用户(可以说是视频处理),​​它也可以通过另一个线程提供另一个请求,以便多个用户可以同时访问我们的系统。