Ruby on rails with jRuby

Gan*_*row 4 ruby java scaling ruby-on-rails heroku

我正在开发一个Ruby on Rails应用程序,目前托管在Heroku上.我们平均有大约5个网络dynos和大约2个工作进程.但是因为我们使用的是adeptscale,所以这些变化很大,而且成本每月都在增加.

我们正在考虑改变流程和基础设施(使用我们自己的,亚马逊/谷歌等).而且由于性能,访问java库以及我们计划使用jRuby获得的其他收益.

我根本没有jRuby的经验,但我确实有Java经验.所以我有几个问题:

问题介绍:由于rails哲学/方法与Javas不同,即ruby webserver使用的内存少得多,但一次只能处理一个请求,因此有多个服务器可以补偿无法处理多个请求.

  1. 如果我们使用jRuby(并将我们的rails项目打包为war文件并部署到任何servlet容器,即Tomcat或Jboss(不仅仅是容器)),那么我们能够处理多个请求吗?

问题介绍:目前我们在工作者中运行了一些应用程序逻辑(而不是阻止Web服务器,而不能为其他客户端/浏览器客户端提供服务).即当用户提交某个表单然后我们的应用程序需要联系第三方服务以返回响应时,我们只需让工作人员完成从第三方服务返回的工作量并通过websockets更新ui(报告等待状态)第三方服务返回x/y或任何状态.

  1. 如果我们切换到jRuby,我们将如何实现类似的逻辑?我的意思是我们使用java代码,它有一些工作线程池,然后免费工作人员负责联系第三方服务等?如果我们决定和jRuby一起去,我们将如何解决这个问题呢?

sma*_*ton 5

1)您可以使用几乎任何容器在jruby中一次提供多个请求,但您也可以使用mri-ruby一次提供多个请求.您只需要一个线程安全的应用程序(config.threadsafe!在rails4中是默认的).不同的机架服务器有不同的方法一次服务多个请求.例如,独角兽使用多个过程,而乘客或美洲狮则采用多线程方法.

根据我的经验,像jboss或tomcat这样的jruby容器配置起来比较复杂.但是像tourquebox,trinidad这样的东西可以帮助你解决这个问题.但你甚至可以去一些不使用c扩展的ruby服务器(例如puma).

2)如果我理解你正确你正在寻找一些后台处理库?您可以使用sidekiq或resque与ruby或jruby(而jruby一般会更快,并且更容易调试内存泄漏).您甚至可以将ruby用于机架服务器,并为工作人员使用jruby(甚至可以与rvm/rbenv等并行运行)

一般情况下,如果您知道自己在做什么,并且需要为应用服务器提供更好的性能,或者想要加快工作服务器的速度,我只会选择jruby选项.如果我是你,我可能会留在红宝石世界,并使用美洲狮为您的应用程序和sidekiq作为后台服务.两者都非常优雅,不需要那么多配置.