2

(这个问题是如何处理 Rails App 的长请求以便其他用户不会延迟太多的后续问题? )

用户向我的 Rails 应用程序提交一个答案,它会在后端被检查长达 10 秒。这会导致所有其他用户的延迟,因此我正在尝试使用延迟作业gem 将检查移至 Worker 进程。Worker 代码将结果返回给控制器。但是,控制器没有意识到它应该耐心等待结果,因此会导致错误。

如何让控制器等待结果并让应用程序的其余部分同时处理简单的请求?
在 Javascript 中,人们会使用回调来调用函数而不是返回值。我应该在 Ruby 中做同样的事情并从 Worker 回调控制器吗?

更新:
或者,我如何从 Worker 调用控制器方法?然后我可以在完成后调用相关操作。

这是相关代码:

控制器:

def submit
  question = Question.find params[:question]
  user_answer = params[:user_answer]
  @result, @other_stuff = SubmitWorker.new.check(question, user_answer)
  render_ajax 
end

submit_worker.rb :

class SubmitWorker
 def check
   #lots of code... 
 end
 handle_asynchronously :check 
end
4

2 回答 2

4

使用 DJ 卸载工作是绝对正常和正常的,但让控制器等待响应反而会失败。

您可以在check方法的末尾添加某种形式的回调,以便在作业完成时通知您的用户。

你可以在这个问题中找到一些关于执行通知的讨论:push-style notifications simliar to Facebook with Rails and jQuery

或者,您可以让您的浏览器定期调用一个控制器操作来检查作业的结果 - 理想情况下,结果将是一个 ActiveRecord 对象。再次,您可以在这个问题中找到关于周期性 javascript 的讨论:Rails 3 等价于periodic_call_remote

于 2013-08-07T19:05:52.527 回答
0

我认为您在这里尝试做的事情几乎没有矛盾,因为您使用delayed_jobwhen do done 希望中断控制流(因此您的用户在请求完成之前不希望这样做)。

但是,如果您希望您的控制器在获得结果之前一直想要,那么您不想使用后台进程,例如delayed_job.

在完成检查后,您可能想考虑不同的方式通知用户,同时保持后台进程不变。

于 2013-08-07T00:16:58.753 回答