Ruby on Rails 不能很好地处理多线程请求响应,或者至少 ActiveRecord 不能。
在创建需要很长时间才能完成的 shell 命令的 Web 应用程序时,同时只有一个请求-响应处于活动状态的概念可能会很麻烦。
我想谈谈你对这类设置的一些看法?Rails 可能不适合某些应用程序吗?
此外,关于 Ruby on Rails 中的并发性,目前的状况是什么?什么是最佳实践。有没有针对缺点的解决方法?
Ruby on Rails 不能很好地处理多线程请求响应,或者至少 ActiveRecord 不能。
在创建需要很长时间才能完成的 shell 命令的 Web 应用程序时,同时只有一个请求-响应处于活动状态的概念可能会很麻烦。
我想谈谈你对这类设置的一些看法?Rails 可能不适合某些应用程序吗?
此外,关于 Ruby on Rails 中的并发性,目前的状况是什么?什么是最佳实践。有没有针对缺点的解决方法?
Rails 目前不处理单个 MRI (Matz Ruby Interpreter) Ruby 进程中的并发请求。每个请求本质上都用一个巨大的互斥体包装。为使即将推出的 Rails 2.2 线程安全而做了大量工作,但在 Ruby 1.8x 下运行时,您不会从中获得很多好处。我无法评论 Ruby 1.9 是否会有所不同,因为我对它不是很熟悉,但我可能没有想到。
在这方面看起来非常有前途的一个领域是使用 JRuby 运行 Rails,因为 JVM 通常被认为擅长多线程。Sun Microsystems 的Arun Gupta最近在 RailsConf Europe 上给出了一些有趣的性能数据。
Matz 的 Ruby 1.8 使用绿色线程,而 Matz 的 Ruby 1.9 将使用原生 O/S 线程。Ruby 1.8 的其他实现,例如 JRuby 和 IronRuby,使用本机 O/S 线程。YARV 是 Yet Another Ruby VM 的缩写,它也使用本机 O/S 线程,但具有全局解释器锁,以确保在任何给定时间只有一个 Ruby 线程正在执行。
Neverblock允许在不修改您编写程序的方式的情况下实现非阻塞功能。这确实是一个令人兴奋的项目,并且被反向移植到 Ruby 1.8.x 上(它依赖于 Ruby 1.9 的纤维)。它与 PostgreSQL 和 MySQL 一起工作以执行非阻塞查询。基准很疯狂...
如果您在 shell 上运行的内容对于页面的呈现不是必需的(例如,您只是触发维护任务或其他内容),您应该将它们作为后台进程启动。看看八哥和工作。
如果这不适用于您的情况,您必须确保应用服务器的多个实例运行。传统上人们会启动多个 Mongrel 实例。但现在我想说的是,到目前为止,最简单的方法是使用Phusion Passenger。它是一个 Apache 模块,可让您轻松指定要运行的应用服务器的实例数(最小和最大)。其余的由乘客完成。如果我没记错的话,它不会做愚蠢的循环调度请求。我认为这是由可用性决定的。
Ruby 1.9 正在添加轻量级 Fiber: