我是 Heroku 的新手,我有一个应用程序向外部资源发送请求并获得响应,此响应可能需要 30 多秒可能需要 1 到 3 分钟。我得到错误 H-12 我不能使用 delay_job 因为我的下一步完全依赖于外部资源的数据。请任何人都可以帮助我该怎么做才能解决这个问题。提前致谢
2 回答
您唯一的选择是加快外部数据的检索。Web 请求必须响应的最长时间是 30 秒,然后才会被 heroku 杀死并返回 h12。
Heroku 上根本不可能有 1-2 分钟的请求。如果可能,您唯一的选择是在定期检索数据后缓存数据。或者,delayed_job 样式的方法,但是您随后轮询作业,直到它通过 Ajax 完成并且当数据在服务器上可用时提示用户继续。
基于@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