【问题标题】:Benefits of jRuby with Rails 4jRuby 与 Rails 4 的优势
【发布时间】:2025-12-20 23:05:12
【问题描述】:

我目前正在考虑迁移到 jRuby,但我仍然不确定一切将如何工作,但让我们考虑一下这种假设情况。

user 1 在我的应用程序中加载一个页面大约需要 2.5 秒,而在大约 500ms 执行时,user 2 尝试打开不同的页面,加载需要 1 秒。

如果我的估计是正确的,那么如果您在 MRI 中使用单个进程运行它会发生这种情况:

  1. 用户 1 等待 2.5 秒以加载其页面
  2. 用户 2 等待 3 秒等待其页面加载(等待用户 1 完成页面加载 2 秒,等待其页面完成渲染 1 秒)

我的估计正确吗?

假设如果我在 jRuby 下运行相同的应用程序会发生这种情况:

  1. 用户 1 等待 2.5 秒以加载其页面
  2. 用户 2 等待 1 秒或更长时间,但少于 3 秒,具体取决于来自用户 1 的请求占用了多少内存/cpu

我的其他估计是否正确?当然假设您的代码是线程安全的。如果我的估计不正确,请纠正我,或者如果它是正确的,我是否需要确保在 Rails 应用程序级别设置了某些配置,或者我应该注意线程安全代码以外的其他内容?

更新

我刚刚完成了一个小型 jRuby POC 应用程序,使用 warbler gem 构建了一个 war 文件,并将一个 war 部署到 Tomcat Web 服务器。我不认为我对 jRuby 的估计是正确的,这是我观察到的:

  1. 用户 1 等待 2.5 秒以加载其页面
  2. 用户 2 等待 3 秒

哪个与MRI相同,在请求处理方面,jRuby不应该并行处理这些吗?

【问题讨论】:

  • 如果您的目标是异步处理多个请求 - 我建议您访问像 unicorn 这样的多进程网络服务器
  • @Anthony 是的,那是我的目标。与 jruby 一起使用 Tomcat(java servlet 容器和应用服务器)是否会得到相同的结果?

标签: ruby-on-rails ruby multithreading ruby-on-rails-4 jruby


【解决方案1】:

我们说的是假设的事情(和假设)

如果“在我的应用程序中加载一个页面大约需要 2.5 秒” 所有用户都会(同时)继续加载这个东西,除非你在第一次加载后做一些缓存或存储它以供其他用户使用用户。

不同之处在于,在 MRI 中,每当执行 Ruby 代码(不等待 IO,例如数据库或从 http:// 加载某些内容)时,2 个线程不会同时运行,而在 JRuby 中它们会。

如果您在 JRuby 上看到 User 2 waits for 3 seconds,则表示 smt 正在阻止多个请求,例如一路上有一个Mutex(例如Rack::Lock)。

【讨论】: