【发布时间】:2013-06-20 06:35:59
【问题描述】:
我是 Heroku 的新手,我有一个应用程序向外部资源发送请求并获得响应,此响应可能需要 30 多秒可能需要 1 到 3 分钟。我得到错误 H-12 我不能使用 delay_job 因为我的下一步完全依赖于外部资源的数据。请任何人都可以帮助我该怎么做才能解决这个问题。 提前致谢
【问题讨论】:
标签: ruby-on-rails heroku timeout delayed-job
我是 Heroku 的新手,我有一个应用程序向外部资源发送请求并获得响应,此响应可能需要 30 多秒可能需要 1 到 3 分钟。我得到错误 H-12 我不能使用 delay_job 因为我的下一步完全依赖于外部资源的数据。请任何人都可以帮助我该怎么做才能解决这个问题。 提前致谢
【问题讨论】:
标签: ruby-on-rails heroku timeout delayed-job
您唯一的选择是加快外部数据的检索。 Web 请求必须响应的最长时间是 30 秒,然后它才会被 heroku 杀死并返回一个 h12。
1-2 分钟的请求在 Heroku 上根本不可能。如果可能,您唯一的选择是在定期检索数据后缓存数据。或者,delayed_job 样式的方法,但您随后轮询作业,直到它通过 Ajax 完成,并且当数据在服务器上可用时提示用户继续。
【讨论】:
基于@johns 的回答,heroku 的 cedar 堆栈提供了除默认 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。
现在在您的app 目录中创建一个workers 目录并像这样创建一个工人类:
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
这将在您的本地计算机上启动您的网络和工作线程。
要让它在 heroku 上运行,你只需要扩大工作人员的规模。 heroku 控制台将为您提供执行此操作的选项,或者您可以使用命令行heroku ps:scale worker=1
【讨论】: