长时间延迟运行rails的最佳方式

时间:2010-12-30 19:44:39

标签: ruby-on-rails ruby jruby

我正在编写一个Rails Web服务,该服务与分散在全国各地的各种硬件进行交互。

当对Web服务进行调用时,Rails应用程序会尝试联系相应的硬件,获取所需信息并回复Web客户端。客户电话和回复之间的时间可能长达10秒,具体取决于很多因素。

我不想将Web服务调用分成两部分(询问信息,立即回复待处理的回复,然后再强制执行api调用以获得实际结果)。

我基本上看到两个选项。要么运行JRuby并使用多线程,要么运行几个常规的Ruby实例,并希望一次没有多少人尝试使用该服务。 JRuby似乎是更好的解决方案,但它似乎仍然不是主流,并且在Heroku和EngineYard上提供了开箱即用的支持。多实例解决方案似乎是一个完全的解决方案。

1)我对我的两个选择是对的吗?还有一个我错过的更好的吗? 2)JRuby有一个简单的部署选项吗?

3 个答案:

答案 0 :(得分:2)

  

我不想将Web服务调用分成两部分(询问信息,立即回复待处理的回复,然后再强制执行api调用以获得实际结果)。

从工程角度来看,这似乎是最好的选择。

你为什么不想这样做?

答案 1 :(得分:1)

还有第三种选择:如果您使用Passenger托管Rails应用并启用global queueing,则可以透明地执行此操作。我有一些行动需要几分钟,没有问题(警告:一些浏览器可能会超时,但这可能不是你的担忧)。

如果您担心浏览器超时,或者无法控制部署环境,则可能需要在后台处理它:

  1. 用户请求数据
  2. 您将请求输入队列
  3. 您的网络服务返回“故障单”标识符以检查进度
  4. 后台进程处理队列中的作业
  5. 用户轮询,引用“ticket”id
  6. 至于在JRuby中托管,我使用glassfish gem部署了一些小型内部应用程序,但我不确定对于面向客户的应用程序我会信任多少。只需确保在production.rb中运行config.threadsafe!。我也听说过有关Trinidad的好消息。

答案 2 :(得分:0)

您还可以在延迟后台作业中运行Web服务调用,这样就不会占用Web服务器,甚至可以在单独的物理盒上运行。这也是一种更加可扩展的方法。如果您使用AJAX进行Web调用,那么您可以每两秒或两次ping一次服务器以查看您的结果是否准备就绪,这样您的客户端在计算结果并且请求没有超时时就不会处于不稳定状态。 / p>