【问题标题】:How do I postpone processing of a Ruby on Rails route?如何推迟处理 Ruby on Rails 路由?
【发布时间】:2017-03-13 05:56:15
【问题描述】:

我有一个 Ruby on Rails 路线; config/routes.rb 说:

post 'upload/testruns' => 'upload#testruns'

app/controllers/api/upload_controller.rb 我有一个:

def testruns

方法,它处理POST。问题是方法处理时间会随着上传数据的累积而增加,因为它需要相关的计算(例如,保存统计信息,每次上传时重新计算它们等)。

这会阻塞另一端(即启动 POSThttps://app.com/upload/testruns 的一端),它最终会达到硬编码超时。我完全可以增加超时时间,但这是一场猫捉老鼠的游戏,很快就需要一次又一次地增加。

我如何在收到POST(应该只是几秒钟)后立即从 testruns 处理方法返回并延迟例如稍后进行统计处理?

发布的数据不大;正是积累的历史使它的过程越来越漫长。

【问题讨论】:

  • 使用后台作业 activejob 或单独使用 sidekiq resque 将在后台进行所有处理并使用作业 ID 发送快速响应,因此响应时间会更短

标签: ruby-on-rails ruby post


【解决方案1】:

您可以通过运行以下命令创建一个使用 ActiveJobs 的作业:

rails generate job test_runs

编辑工作

class TestRunJob < ApplicationJob
  queue_as :default

  def perform(params)
    # Do you the stuff you need to do with your params
  end
end

然后在您的控制器中开始工作。这允许 ActiveJob 运行而不会妨碍向您的客户端发送回响应(传入您的参数和参数):

class Upload < ActionController
  def testruns
    # Initiate Job
    TestRunJob.perform_later(params)

    # Respond to client immediately
    render plain: "Doing the stuff, continue on now"
  end
end

您还可以通过安装 gem 并在 application.rb 中配置适配器来使用所需的任何后台作业服务:

# config/application.rb
module YourApp
  class Application < Rails::Application
    config.active_job.queue_adapter = :sidekiq
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2018-12-28
    • 2011-05-11
    相关资源
    最近更新 更多