【问题标题】:What do I need to know about JRuby on Rails after developing RoR Apps?开发 RoR 应用程序后,我需要了解有关 JRuby on Rails 的哪些信息?
【发布时间】:2021-05-19 13:16:00
【问题描述】:

我已经使用 Ruby on Rails 完成了一些项目。我将使用 JRuby on Rails 并将其托管在 GAE 上。在那种情况下,我在开发 JRuby 应用程序时需要了解哪些内容。我读到了

  • JRuby 具有相同的语法
  • 我可以访问 Java 库
  • JRuby 无法访问某些 gem/插件
  • JRuby 应用程序第一次加载需要一些时间,所以我必须通过发送 每 5 分钟左右请求一次
  • 我不能使用 ActiveRecord,而必须使用 DataMapper

如果我对我所做的任何陈述有误,请更正,还有什么我必须知道的吗?我是否需要从头开始阅读有关 JRuby 的知识,或者我可以像往常一样开发 Ruby 应用程序?

【问题讨论】:

    标签: ruby-on-rails ruby google-app-engine jruby jrubyonrails


    【解决方案1】:

    我每天都使用 JRuby。

    正确:

    • JRuby 语法相同
    • JRuby 无法访问某些 gem/插件
    • 我可以访问 Java 库

    有些 gems/plugins 有特定于 jruby 的版本,有些根本不工作。总的来说,我发现的问题很少,随着库和平台的成熟,很多问题都已经消失(JRuby 变得更好了)。

    您可以访问 Java,但通常为什么要访问?

    错误:

    • 第一次加载 JRuby 应用程序需要一些时间,所以我必须通过每 5 分钟左右发送一次请求来保持它处于活动状态
    • 我不能使用 ActiveRecord,而必须使用 DataMapper

    虽然我猜可以想象一个服务器设置,其中 JVM 的初始启动/预热成本意味着您需要 ping 服务器,但 JRuby 中没有任何固有的东西可以实现这一点。如果您需要保持服务器处于活动状态,您应该查看您的部署环境。与乘客共享主机也会发生类似的情况,其中应用在一段时间不活动后可能会耗尽内存。

    此外,我们使用 ActiveRecord 完全没有问题。

    【讨论】:

    • 感谢您的回答。我还有一个问题。 JRuby 是 Ruby 1.8.7 的一个实现,它存在性能问题。你能告诉我,JRuby 有没有这样的问题?
    • 1.8.x 的一些性能问题与 Ruby VM 中的线程和 GIL 相关。 JRuby 没有这些问题,因为它依赖于 JVM 和 JVM 线程模型。一般来说,性能概况完全不同。
    • @TobyHede,你好像对这件事有一些经验,你能在这里做出有根据的回答吗stackoverflow.com/questions/20899423/…
    【解决方案2】:

    afaik,rails 3 与 jruby 100% 兼容,因此在该路径上应该没有问题。

    像每个新平台一样,您应该通过使用 jruby 来让自己适应它。我建议使用 RVM 来做到这一点。

    就你的问题而言:

    • JRuby 只是像 MRI 或 Rubinus 一样的其他运行时
    • 由于 JRuby 在 JVM 中,使用 Java 非常容易,但您也可以使用 MRI 中的 RJB
    • 一些 gem 不兼容,当它们使用原生 c 库时,它们不能在 JRuby 上运行
    • JVM 和您的应用程序容器需​​要启动时间和一些时间来加载您的应用程序,但仅此而已,不需要保持活动状态,这是错误的
    • 你可以使用任何你想要的东西,大多数 gem 都更新为与 JRuby 兼容

    【讨论】:

      【解决方案3】:

      @TobyHede 主要涵盖了您认为自己可能遇到的问题,所以我将不再赘述。

      至于其他要记住的事情,这只是一个不同的解释器,有趣的差异会突然出现,这需要一些适应。

      1. 有些方法的实现方式不同,例如sleep 10.seconds 会抛出异常(你必须sleep 10.seconds.to_i),我记得从MRI 切换到JRuby 时Symbol 类上出现NoMethodError(不记得哪个方法没有实现),请记住会有细微的变化
      2. 您将在原本对您有用的 gem 中遇到挂起和异常(例如在列出超过一页时撬开)
      3. 某些 gem 的工作方式可能不同,例如,如果您按 ctrl+c,pry(再次)将退出,这很烦人
      4. 所有内容的加载时间稍慢,没有宙斯
      5. 您会偶尔收到 java 异常堆栈跟踪,但没有任何迹象表明它发生在哪一行 ruby​​ 代码
      6. Timeout.timeout 通常不会像预期的那样工作,当它包裹在网络代码和星星对齐不好时(这主要在 jruby 核心中修复,但它似乎仍然是在纯 java 中执行自己的网络代码的 gem 的问题)李>
      7. 在第三方代码 How do you choose gems for a high throughput multithreaded Rails app? 中隐藏的线程安全问题 - 例如远离 EventMachine
      8. 线程会很棒(由于原生且没有 gil),而 Fiber 会很糟糕(由于 JVM 中没有协程支持,它们是普通线程),这就是为什么与赛璐珞相比,您通常不会获得性能提升做核磁共振
      9. 您曾经使用 MRI Ruby 作为操作系统中的进程来运行 Rails,您知道如何跟踪它们的 PID、膨胀、运行时间、杀死它们、监视它们等,当您切换到 JRuby 时这部分并不明显,因为一切已转向单个进程中的线程。 Java 世界有很好的工具来处理这些问题,但你必须学习它
      10. killall -9 ruby 在您的控制台挂起时无法使用 jruby(它比以前更频繁),您必须 ps -ef 然后跟踪正确的进程而不会杀死您的 netbeans 等(次要,但很烦人)李>
      11. 由于我的最后一点,了解 Java 和 JVM 将帮助您在某些情况下摆脱困境(取决于您打算做什么,这可能是您真正真正需要的东西),部署服务器的选择会增加或减少这种需求(例如,扭矩箱有点臭名昭著,其他部署选项可能更简单,请参阅http://thenerdings.blogspot.com/2012/09/pulling-plug-on-torquebox-and-jruby-for.html
      12. ...

      另外,看看 jruby 团队对差异的看法,https://github.com/jruby/jruby/wiki/DifferencesBetweenMriAndJruby

      但是是的,否则它“与 MRI Ruby 一样”:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 2023-04-05
        • 2011-07-30
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多