【问题标题】:heroku: how to avoid timeout when post some data to herokuheroku:将一些数据发布到heroku时如何避免超时
【发布时间】:2011-11-19 04:49:05
【问题描述】:

我在heroku上有一个ROR应用。应用上有8个可选文本字段,用户可以根据自己的要求填写或留空。

用户填写的文本字段越多,我的应用需要执行的流程就越多。如果填写的字段超过 5 个,我的应用程序将处理超过 30 秒的请求,这将导致 Heroku 超时。

有没有办法解决这个问题?

听说用javascript和ajax可以把一个请求分成两部分,我想这样可以避免超时问题。但是,我不知道该怎么做。

谢谢!

【问题讨论】:

  • 您提交的表单填写了 8 个字段中的 5 个并且服务器超时?你对表单数据做了什么?

标签: javascript ruby-on-rails ruby ajax heroku


【解决方案1】:

从用户的角度来看,这样的延迟是不可接受的。

您应该使用 Resque 或 DelayedJob 将表单处理委托给工作人员。

【讨论】:

    【解决方案2】:

    您只需将处理作为后台作业进行。在 Heroku 上,这非常简单。使用 Resque + Redis,但你也可以使用 DelayedJob。 Resque(由 github 构建)是 Redis(键值存储)之上的队列层。扩展比使用 DelayedJob 进行排队要容易得多,但无论哪种方式都有效。

    1. 首先,安装免费的 Heroku Redis to Go addon
    2. 然后只需按照 Redis To Go 的 Resque with Redis on Heroku blog Post 设置 gem 等。

    设置完成后,您只需执行以下操作:

    1. 发布表单数据。
    2. 保存它未处理以供以后处理。
    3. 告诉 Resque 您已将某些内容添加到队列中。

    如果你的表单是用户创建表单,代码可能是这样的:

    module SaveUser
      @queue = :save_user
    
      def perform(attributes = {})
        user = User.create(attributes)  
        user.process! if user && !user.processed_everthing?
      end
    end
    
    def create
      Resque.enqueue(SaveUser, params[:user])
    end
    

    …你也可以像下面这样写(在队列中只存储id,而不是参数)

    module SaveUser
      @queue = :save_user
    
      def perform(id)
        user = User.find(id)
        user.process! if user && !user.processed_everthing?
      end
    end
    
    def create
      user = User.create(params[:user])  
      Resque.enqueue(SaveUser, user.id)
    end
    

    通过对所有内容进行排队,用户几乎会立即被带到下一页。

    但是,如果用户需要立即在下一页上看到处理结果,那么您只需要找出其他的办法。

    【讨论】:

    • 衷心感谢!我认为您的建议会有所帮助。但是,当我按照说明执行命令时: $ rake resque:work QUEUE=* 有一些问题: Hu-Brians-MacBook:nextptt Brian$ rake resque:work QUEUE=* --trace rake aborted!请安装 yajl-ruby 或 json gem 该怎么办?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 2019-01-31
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多