星期三,2008 年 12 月 17 日

推出 Rails Metal

大卫发帖

Rails Edge 于不久前采用了 Rack,我们一直在探索更好的展示方式。我们所做的第一件事就是,让在 Rails 请求前连接任何一件 Rack 中间件变得极其容易。在 config/environment.rb 文件中,您可以执行以下操作

config.middlewares.use(Rack::Cache, :verbose => true)

这将使您的应用程序使用 莱恩·托迈科出色的 Rack::Cache 中间件 来进行更好的 HTTP 缓存。还有很多其他出色且可重复使用的 Rack 中间件。快去选购吧。

但在其他情况下,Rack 也会派上用场。如果您有一个 Rails 应用程序,具有需要非常快的服务端点。如此之快,以至于经过 Rails 路由器和 Action Controller 路径的几毫秒时间都太长了。

针对此情况,我们在通用 Rack 中间件周围构建了一个轻量级包装器,并在层次结构中以“Metal”这个名称赋予它一席之地。Rails Metal 是针对 Campfire 轮询服务等内容而设计的,它需要执行每秒数百次请求,必须非常快,同时又非常简单(2 个数据库调用并返回一个字符串)。此服务目前采用 C 编写,但我们会考虑将其转换为 Rails Metal。

Rails Metal 是 Rack 中间件的一个子集
将 Rails Metal 视为专门针对需要额外速度(“写入 metal”——这正是其名称的由来)的特定于应用程序的端点的中间件的一个子集。借助最近对 Rack 会话的采用,这些 metal 甚至可以访问与 Rails 相同的会话。您可以将它们作为 Rails 进程的一部分来运行,也可以通过 rackup 将它们作为单独的服务来运行。

我们甚至还为 Metal 添加了一个生成器,默认情况下,它将按照以下模式创建存根

class Poller

正如您所看到的,其功能是捕获对 /poller 的请求并返回“Hello, World!”(并且请求不针对 /poller,它将让 Rails 路由器来处理它——这是 404 返回所做的)。它将在 Rack 中以技术上最快的速度执行此操作(无用的指标提示 Rails 现在拥有最快的、最无意义的“hello world”统计数据!!)。

请注意,这是一个非常专业的工具。尽管你可以使用金属编写一个完整的 Rails 应用程序,但在大多数情况下这样做是个糟糕的主意。绝大多数应用程序永远都不会做得像它们所做的那样快,以至于已经经过大量优化的 Rails 路由器和 Action Controller 执行路径的开销重要一分一毫(通过洪流下载 Michael Koziarski 关于 Rails 性能的讲座,可以更深入地了解这一点)。

此外,如果你正在编写类似 Rack::Cache 的通用过滤器,那么 Metal 也不是正确的选择。你应该只创建可在所有 Rack 应用程序中共享的常用中间件。

但是对于那些你只需要尽可能高的原始速度的特殊情况,Metal 可能是医生叮嘱的良方。它允许你将两个世界的优点集合在一个程序包中。当重要时,Rack 应用程序的开销尽可能低,而当不需要时,拥有 Action Controller 的全功能好处。

我们希望你喜欢这个。Josh Peek 已经不厌其烦地花费了大量时间在 Rails on Rack 上,而这只是他努力工作的最新成果。非常感谢,Josh!

更新:Jesse Newland 也撰写了一篇有关 Metal 的精彩简介。其中包括基准测试和更多示例!

更新 2:将代码示例更改为匹配最新样式