从外部资源获取数据时超时



我是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

相关内容

  • 没有找到相关文章