从外部资源获取数据时Heroku超时

时间:2013-06-20 06:35:59

标签: ruby-on-rails heroku timeout delayed-job

我是Heroku的新手我有一个应用程序,它向外部资源发送请求并获得响应,此响应可能需要超过30秒,可能需要1到3分钟。我得到错误H-12我不能使用delay_job因为我的下一步完全依赖于外部资源的数据。请任何人帮助我,我该怎么做才能解决这个问题。 提前致谢

2 个答案:

答案 0 :(得分:2)

您唯一的选择是加快外部数据的检索速度。 Web请求必须响应的最长时间是在被heroku杀死并返回h12之前30秒。

Heroku根本无法提出1-2分钟的请求。您可以选择在定期检索数据后尽可能缓存数据。或者,使用delayed_job样式方法,然后轮询作业,直到它通过Ajax完成,并且当服务器上的数据可用时提示用户继续。

答案 1 :(得分:1)

在@johns回答的基础上,heroku的雪松堆栈提供了除默认web以外的更多选项。

您需要使用delayed_job或我个人最喜欢的sidekiq来运行您的工作。

首先在项目的根目录中创建一个名为Procfile的文件

web:    bundle exec rails server -p $PORT
worker: bundle exec sidekiq -c 15

Procfile的文档可在heroku上找到。

将sidekiq添加到您的gemfile并运行bundle install

您需要运行类似redistogo的redis服务器,并且您也应该在开发环境中安装redis。

现在在workers目录中创建一个app目录并创建一个这样的工人类:

class MyWorker
  include Sidekiq::Worker

  def perform
    # insert slow task here
  end
end

如果您想执行慢速任务调用,请在控制器调用中说明

MyWorker.perform_async()

它也可以像参数一样使用

def perform(name)
   MyModel.doSomethingSlow(name)
end

然后

MyWorker.perform_async("foobar")

请记住这是异步的,该方法将在后台运行,除非您的代码中有某些内容检查结果已完成,否则您将不知道。

请参阅开发中的所有操作,确保安装了foreman(默认安装了heroku toolbelt)并调用foreman start

这将启动本地计算机上的Web和worker。

要在heroku上运行,您只需要扩展工作人员。 heroku控制台将为您提供执行此操作的选项,或者您可以使用命令行heroku ps:scale worker=1