Ruby on rails 3 如何在Heroku中处理长web请求?

Ruby on rails 3 如何在Heroku中处理长web请求?,ruby-on-rails-3,heroku,controller,timeout,httprequest,Ruby On Rails 3,Heroku,Controller,Timeout,Httprequest,30秒,并根据其文档触发超时错误 我正在上传和解析一个CSV文件以保存到我的数据库中。其中一个文件大小为1.7MB,有37000行 这个过程需要一点时间来处理,当然超过30秒 在这种情况下我能做什么?我有什么选择 require 'csv' class DatabaseImporterController < ApplicationController def index end def import # Receive the uploaded CSV file


30秒,并根据其文档触发超时错误

我正在上传和解析一个CSV文件以保存到我的数据库中。其中一个文件大小为1.7MB,有37000行

这个过程需要一点时间来处理,当然超过30秒

在这种情况下我能做什么?我有什么选择

require 'csv'

class DatabaseImporterController < ApplicationController
  def index
  end

  def import
    # Receive the uploaded CSV file and import to the database.
    csv_file = params[:csv_file].tempfile

    i = 0
    CSV.foreach(csv_file) do |row|
      # Structure for CSV file: Year, Make, Model, Trim
      if i > 0 then
        make = Make.find_or_create_by_name(row[1])
        model = make.model.create(:year => row[0], :name => row[2], :trim => row[3])
      end

      i += 1
    end
    redirect_to :action => 'list'
  end

  def list
    @models = Model.all
  end
end
需要“csv”
类DatabaseImporterController0,那么
make=make.find_或按_名称创建_(第[1]行)
model=make.model.create(:year=>行[0],:name=>行[2],:trim=>行[3])
结束
i+=1
结束
重定向到:action=>“list”
结束
定义列表
@models=Model.all
结束
结束

不要在控制器中处理CSV文件,而是让它将通知推送到带有上载文件位置的队列中。然后有一个句柄进行处理

你会多付一点钱,特别是如果你想坚持使用免费的单dyno层,但这是一个可伸缩的设计(这就是为什么我认为HTTP处理会有30秒的超时)

另一种方法是将数据直接推送到表中,并异步执行存储过程。这将把工作推到Postgres来处理HTTP线程,并且可能将您的请求置于30秒的时间限制下,不过对于较大的文件,您无论如何都可以轻松地打开此上限

在重新构造整个应用程序以确保Heroku未被禁用之前


上面代码中的最大成本是
Make.find_或\u create_by_name
,这将调用37000个单独的-根据您的示例输入-为CSV中的每一行选择并可能插入。如果libpq asynch不是一个选项,那么您必须创建一个存储过程,该过程将一次执行100或1000行的批处理,这样您的控制器代码就不会对数据库进行太多的往返。Postgres支持经典的顺序索引样式以及数组,因此这实际上比听起来要轻松得多。

不幸的是,为更多的动态对象支付更多的费用不是一个选项。还有其他建议吗?