【问题标题】:Rails Controller - Return and then perform complex action (without worker)Rails 控制器 - 返回然后执行复杂的操作(没有工人)
【发布时间】:2015-03-25 17:19:32
【问题描述】:

我想在我的应用程序中创建一个 API 端点,它接收数据并使用它执行复杂、耗时的操作,但只有在返回数据已收到之后

就像这样,我希望能够做这样的事情:

def action
  render json: { data_received: params[:whatever].present? }
  perform_calculations( params[:whatever] )
end

不幸的是,据我了解,Ruby/Rails 是同步的,并且要求控制器操作 endrender/redirect/head 某种声明中。

通常,我会考虑使用后台工作人员来完成此任务,如下所示:

 def action
   DelayedJobActionPerformer.perform_later(params[:whatever])
   render { data_received: params[:whatever].present? }
 end

但是,一个工人(在 Heroku 上)每月要花相当多的钱来购买这样的初级应用程序,我正在寻找替代方案。除了后台工作人员之外,您是否可以考虑从操作中返回并然后执行该行为?

我正在考虑可能创建一个单独的 Node 应用程序或可以启动一个动作然后响应的东西,但这感觉很荒谬。我想我的架构会涉及一个主要的 Rails 应用程序,它执行大部分行为,以及一个轻量级的 Node 应用程序,它充当 API 端点,它可以接收请求,响应它已被接收,然后发送数据由第一个 Rails 应用程序或其他应用程序执行。但这感觉有点过分了,也像是把问题推到了后面。

无论如何,无论我最终是否不得不购买一个工人或几个工人,我都想知道这种事情是否可行,以及使用外部 API 作为准工人是否有意义(尤其是考虑到打破应用程序问题的总体趋势)。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 asynchronous heroku delayed-job


    【解决方案1】:

    听说过sucker_punch,可以试一试。这将在单个 webprocess 中运行,但缺点是如果 web 进程重新启动并且有尚未处理的作业,它们将丢失。因此不推荐用于关键的后台任务。

    【讨论】:

      【解决方案2】:

      不是真的……

      你可以生成一个新线程:

      thread = Thread.new { perform_calculations( params[:whatever] ) }
      

      并且不调用thread.join,但这是非常不可靠的,因为如果主线程终止,该线程将被杀死。

      我不知道 Heroku 中 cron 作业的情况如何,但另一种选择是有一个包含待处理作业的表,您可以在其中保存 params[:whatever] 并有一个由 cron 定期触发的 rake 任务以检查和执行任何待处理的任务。这个解决方案是一个(真正的)基本工作实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多