我正在读这篇文章:
http://www.modrails.com/documentation/Architectural%20overview.html#web_app_models
它讨论了 Phusion Passenger 如何扩展 Apache2 以充当应用程序服务器。当 HTTP 请求传入时,Phusion Passenger 模块会检查该请求是否应由 Phusion Passenger 服务的应用程序处理。如果是这样,则模块会在必要时为应用程序生成一个进程。将请求转发给应用程序进程,并将响应转发回客户端。为了增强生成过程,乘客充当生成服务器,将 Ruby on Rails 框架代码和应用程序代码缓存在内存中。
这样,每次有新请求进入时,当生成进程时,它都会引用缓存的代码并快速生成进程。但尽管缓存生成与 http 请求相比仍然昂贵。所以就用到了应用程序池。我不明白什么是应用程序池。它是这么说的:
生成的应用程序实例保持活动状态,并将它们的句柄存储到该池中,从而允许以后重用每个应用程序实例。因此,Passenger 具有非常好的平均情况性能。
“保持活动”和“句柄存储在这个池中”是什么意思。我认为这就是缓存的意义所在——让数据在以后保持活动状态。所以我不明白这有什么不同。
答案1
这里不存在二进制开/关情况。这是一个连续体。
连续体的一个极端是旧的计算机图形图像处理Web 编程模型:Web 服务器重新启动应用程序来服务每个传入的请求。应用程序在处理完请求后就会终止。因为应用程序每次都必须重新启动,所以它必须重建应用状态根据每个请求。这在时间和数据空间上都是昂贵的。
因此,随着时间的推移,已经创建了许多选项来减少费用:
快速CGI使用 CGI 模型,但它在第一次启动后使 CGI 程序保持活动状态,并不断向其提供新的请求。这不仅避免了重新启动 CGI 程序的费用,还让应用程序将状态保存在 RAM 中。
mod_{perl,php,ruby,...}
将实际的应用程序解释器带入 Web 服务器实例,这些系统往往会执行与 FastCGI 相同的操作:在加载每个脚本并将其编译为某种类型之后字节码,它只是向其提供新的请求,而无需重新完成所有工作。您所讨论的这个系统仅比该
mod_foo
方案高一级,它在 RAM 中保存整个应用程序的逻辑模型,因此每个请求需要重新创建的内容甚至更少。mod_foo
我不能说这与你所得到的基本行为到底有什么不同。但重点是,这不是质量上的差异,而是数量上的差异。下一步可能会帮助您了解 Phusion Passenger 的目标,那就是让所有内容在单个长时间运行的应用程序实例中运行。这就是基于 Web 服务器的方式埃尔兰工作,例如氮气。请访问第二个链接,以与基于 Apache 的应用程序的工作方式进行比较。
我相信许多基于 Java 的应用程序服务器都以相同的方式工作。
底线是,所有这一切都是一个优化游戏,用 RAM 和运行时复杂性来换取速度。
答案2
术语“保持活动状态”及其“句柄存储在该池中”指的是与缓存不同的事物。
缓存
缓存是一种将获取成本高昂的数据保存在快速访问位置以供以后重用的机制。您会看到它被用在很多地方,例如:
- 在数据库中查找某些内容
- 解析服务器的IP地址
- 从硬盘访问文件
池化
他们在 Phusion Passenger 文档中提到的“保持活动”是指强制应用程序无限期地保持运行状态,以便我们可以节省启动应用程序所需的时间。
在为 Web 请求提供服务时,您希望应用程序尽可能具有响应能力。如果应用程序启动需要几秒钟,然后再花费几秒钟从数据库请求数据,那么您将无法创建响应式 Web 应用程序。
因此,我们所做的是构建一个轻量级前端,它将接受连接,然后始终保持应用程序的多个实例正常运行,然后前端将执行以下操作:
- 将传入连接分配给已运行的应用程序实例之一
- 从此运行实例获取结果
- 将结果返回给客户端
- 将应用程序的运行实例重新置于“准备处理”状态
例子
我喜欢用杂货店有多个收银机的例子。每个通道都是应用程序服务器的一个实例,每个通道一次只能处理一个用户,但它们一起可以为多个用户提供服务。
如果你看一下Ruby 的 Mongrel HTTP 服务器它被设计成可以以几乎相同的方式在池中运行。
一种流行的配置是使用 mod_proxy_balancer 与多个 Mongrel 实例结合使用 Apache HTTP Server 2.2 作为负载均衡器。每个 Mongrel 实例将在单独的 TCP 端口上运行,通过 mongrel_cluster 管理实用程序进行配置。直到最近,Twitter 仍是这种配置的一个著名实例。
Mongrel 能够为 Ruby on Rails 支持的站点提供服务,而不需要任何其他 Web 服务器,但作为单线程应用程序,此配置不适合除轻负载之外的所有情况