0

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

4

2 回答 2

2

您唯一的选择是加快外部数据的检索。Web 请求必须响应的最长时间是 30 秒,然后才会被 heroku 杀死并返回 h12。

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

于 2013-06-20T06:47:59.197 回答
1

基于@johns 的回答,heroku 的 cedar 堆栈提供了除 default 之外的更多选项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")

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

因此,请在开发中查看这一切,确保您已安装工头(默认情况下使用 heroku 工具带安装)并调用foreman start

这将在您的本地计算机上启动您的 web 和 worker。

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

于 2013-06-20T10:49:41.217 回答