【发布时间】:2025-12-20 23:05:12
【问题描述】:
我目前正在考虑迁移到 jRuby,但我仍然不确定一切将如何工作,但让我们考虑一下这种假设情况。
user 1 在我的应用程序中加载一个页面大约需要 2.5 秒,而在大约 500ms 执行时,user 2 尝试打开不同的页面,加载需要 1 秒。
如果我的估计是正确的,那么如果您在 MRI 中使用单个进程运行它会发生这种情况:
- 用户 1 等待 2.5 秒以加载其页面
- 用户 2 等待 3 秒等待其页面加载(等待用户 1 完成页面加载 2 秒,等待其页面完成渲染 1 秒)
我的估计正确吗?
假设如果我在 jRuby 下运行相同的应用程序会发生这种情况:
- 用户 1 等待 2.5 秒以加载其页面
- 用户 2 等待 1 秒或更长时间,但少于 3 秒,具体取决于来自用户 1 的请求占用了多少内存/cpu
我的其他估计是否正确?当然假设您的代码是线程安全的。如果我的估计不正确,请纠正我,或者如果它是正确的,我是否需要确保在 Rails 应用程序级别设置了某些配置,或者我应该注意线程安全代码以外的其他内容?
更新
我刚刚完成了一个小型 jRuby POC 应用程序,使用 warbler gem 构建了一个 war 文件,并将一个 war 部署到 Tomcat Web 服务器。我不认为我对 jRuby 的估计是正确的,这是我观察到的:
- 用户 1 等待 2.5 秒以加载其页面
- 用户 2 等待 3 秒
哪个与MRI相同,在请求处理方面,jRuby不应该并行处理这些吗?
【问题讨论】:
-
如果您的目标是异步处理多个请求 - 我建议您访问像 unicorn 这样的多进程网络服务器
-
@Anthony 是的,那是我的目标。与 jruby 一起使用 Tomcat(java servlet 容器和应用服务器)是否会得到相同的结果?
标签: ruby-on-rails ruby multithreading ruby-on-rails-4 jruby