我是Heroku的新手,我有一个向外部资源发送请求并获得响应的应用程序,此响应可能需要30多秒,可能需要1到3分钟。我得到错误H-12,我不能使用delay_job,因为我的下一步完全依赖于外部资源的数据。请问有谁能帮我解决这个问题。提前感谢
您唯一的选择是加快外部数据的检索速度。web请求响应的最长时间是30秒,然后被heroku杀死并返回h12。
在Heroku上根本不可能有1-2分钟的请求。您唯一的选择是,如果可能的话,在定期检索数据之后缓存数据。另一种方法是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
目录,并创建一个worker类,如下所示:
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上运行,你只需要扩展worker。heroku控制台将为您提供一个选项,或者您可以使用命令行heroku ps:scale worker=1