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