【问题标题】:Heroku timeout while getting data from external resource从外部资源获取数据时 Heroku 超时
【发布时间】:2013-06-20 06:35:59
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails heroku timeout delayed-job


    【解决方案1】:

    您唯一的选择是加快外部数据的检索。 Web 请求必须响应的最长时间是 30 秒,然后它才会被 heroku 杀死并返回一个 h12。

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

    【讨论】:

      【解决方案2】:

      基于@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 目录并像这样创建一个工人类:

      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

      这将在您的本地计算机上启动您的网络和工作线程。

      要让它在 heroku 上运行,你只需要扩大工作人员的规模。 heroku 控制台将为您提供执行此操作的选项,或者您可以使用命令行heroku ps:scale worker=1

      【讨论】:

      • 感谢回复我关注sidekiq 我有工人类和一个执行方法,它接受两个参数我用 MyWorker.perform_async(arg1,arg2) 调用执行方法,但我得到错误错误没有agrgument(2 比 1)
      • 实际上我在第二个参数中传递了一个会话变量。
      • 第二个参数是否包含在您的执行定义中?默认执行(arg1,arg2)
      • 另外请记住,您发送的参数值将存储在 redis 中并序列化。这意味着如果您将模型传递给执行,它将存储整个内容。更好的做法是传递一个 id 并让 perform 方法查找它
      • MyWorker.perform_async(arg1,session.to_yaml) 和工作 YAML.load 会话对我有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      相关资源
      最近更新 更多