【问题标题】:Best way to run rails with long delays长时间延迟运行轨道的最佳方式
【发布时间】:2010-12-31 05:29:17
【问题描述】:

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

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

我不想将 Web 服务调用一分为二(询问信息,立即回复等待回复,然后强制另一个 api 调用以获得实际结果)。

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

1) 我对我的两个选择是否正确?有没有更好的我想念的? 2) JRuby 有简单的部署选项吗?

【问题讨论】:

标签: ruby-on-rails ruby jruby


【解决方案1】:

我不想将 Web 服务调用一分为二(询问信息,立即回复待处理的回复,然后强制另一个 api 调用以获得实际结果)。

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

你为什么不想这样做?

【讨论】:

  • 这是我的第一个想法。将其设为后台任务,然后让客户端轮询更新几乎是解决此类问题的实际方法。
【解决方案2】:

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

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

  1. 用户请求数据
  2. 您将请求输入队列
  3. 您的网络服务返回一个“票证”标识符来检查进度
  4. 后台进程处理队列中的作业
  5. 用户进行轮询,引用“票证”ID

就在 JRuby 中托管而言,我已经使用 glassfish gem 部署了几个小型内部应用程序,但我不确定我对面向客户的应用程序有多少信任。只要确保在 production.rb 中运行 config.threadsafe!。我也听说过关于Trinidad 的好消息。

【讨论】:

【解决方案3】:

您还可以在延迟的后台作业中运行 Web 服务调用,这样它就不会占用 Web 服务器,甚至可以在单独的物理机器上运行。这也是一种更具可扩展性的方法。如果您使用 AJAX 进行网络调用,那么您可以每隔一两秒 ping 一次服务器以查看您的结果是否准备就绪,这样您的客户端就不会在计算结果时陷入困境并且请求不会超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多