Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从外部资源获取数据时Heroku超时_Ruby On Rails_Heroku_Timeout_Delayed Job - Fatal编程技术网

Ruby on rails 从外部资源获取数据时Heroku超时

Ruby on rails 从外部资源获取数据时Heroku超时,ruby-on-rails,heroku,timeout,delayed-job,Ruby On Rails,Heroku,Timeout,Delayed Job,我是Heroku的新手,我有一个向外部资源发送请求并获得响应的应用程序。此响应可能需要30秒以上,可能需要1到3分钟。我得到了错误H-12,我不能使用delay_作业,因为我的下一步完全依赖于外部资源的数据。请任何人都能帮我解决这个问题。 提前感谢您唯一的选择是加快外部数据的检索速度。web请求响应的最长时间是30秒,然后heroku将其杀死并返回h12 Heroku上根本不可能有1-2分钟的请求。如果可能的话,您唯一的选择是在定期检索数据之后缓存数据。或者,也可以采用延迟作业方式,但您随后会轮

我是Heroku的新手,我有一个向外部资源发送请求并获得响应的应用程序。此响应可能需要30秒以上,可能需要1到3分钟。我得到了错误H-12,我不能使用delay_作业,因为我的下一步完全依赖于外部资源的数据。请任何人都能帮我解决这个问题。
提前感谢

您唯一的选择是加快外部数据的检索速度。web请求响应的最长时间是30秒,然后heroku将其杀死并返回h12


Heroku上根本不可能有1-2分钟的请求。如果可能的话,您唯一的选择是在定期检索数据之后缓存数据。或者,也可以采用延迟作业方式,但您随后会轮询作业,直到作业通过Ajax完成,并且当服务器上的数据可用时,会提示用户继续。

您唯一的选择是加快外部数据的检索。web请求响应的最长时间是30秒,然后heroku将其杀死并返回h12


Heroku上根本不可能有1-2分钟的请求。如果可能的话,您唯一的选择是在定期检索数据之后缓存数据。或者,一种延迟的工作方式,但您随后通过Ajax轮询作业,直到作业完成,并且当服务器上的数据可用时,提示用户继续。

基于@johns answer,heroku的cedar堆栈提供了除默认的
web
之外的更多选项

您将希望使用delayed_job或我的个人收藏夹来运行您的作业

首先在项目的根目录中创建一个名为
Procfile
的文件

web:    bundle exec rails server -p $PORT
worker: bundle exec sidekiq -c 15
Procfile的文档可在上获得

将sidekiq添加到您的GEM文件中并运行
bundle安装

您将需要一个像这样运行的redis服务器,并且还应该在您的开发环境中安装redis

现在,在
应用程序
目录中创建一个
工作者
目录,并创建一个工作者类,如下所示:

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

基于@johns answer,heroku的cedar stack提供了除默认
web
之外的更多选项

您将希望使用delayed_job或我的个人收藏夹来运行您的作业

首先在项目的根目录中创建一个名为
Procfile
的文件

web:    bundle exec rails server -p $PORT
worker: bundle exec sidekiq -c 15
Procfile的文档可在上获得

将sidekiq添加到您的GEM文件中并运行
bundle安装

您将需要一个像这样运行的redis服务器,并且还应该在您的开发环境中安装redis

现在,在
应用程序
目录中创建一个
工作者
目录,并创建一个工作者类,如下所示:

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

感谢您的回复我跟随我有一个worker类和一个带两个参数的perform方法我使用MyWorker调用perform方法。perform_async(arg1,arg2)但我的agrument错误号(2代表1)实际上,我正在第二个参数中传递会话变量。第二个参数是否包含在您的执行定义中?def perform(arg1、arg2)还请记住,您发送的参数值将存储在redis中并在redis中序列化。这意味着,如果您将一个模型传递给perform,它将存储整个内容。更好的做法是传递一个id,让perform方法在upMyWorker.perform\u async(arg1,session.to\u yaml)和in-worker yaml.load session中查找它。我遵循我有一个worker类和一个perform方法,它接受两个参数,我使用MyWorker.perform\u async(arg1,arg2)调用perform方法但是我的agrgument错误号(2对1)实际上我在第二个参数中传递一个会话变量。第二个参数是否包含在您的perform定义中?def perform(arg1、arg2)还请记住,您发送的参数值将存储在redis中并在redis中序列化。这意味着,如果您将一个模型传递给perform,它将存储整个内容。更好的做法是传递一个id,让perform方法在upMyWorker.perform\u async(arg1,session.to\u yaml)和in-worker yaml.load session中查找它