gpt4 book ai didi

ruby-on-rails - 在 Rails 5 中运行后台进程的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-04 18:19:22 25 4
gpt4 key购买 nike

我有一个 Web 应用程序,我需要在其中执行一个需要一段时间才能完成的过程(通常是 1 分钟)。

我将尝试简要解释一下:在我的应用程序中,我有一个算法,它根据一组参数(主要是日期)将外键分配给一组对象。当用户按下我的应用程序中的指定按钮时,将执行 Controller 方法。在该方法中,我调用模型中处理所有逻辑并分配键的方法。如前所述,整个过程大约需要一分钟才能完成。

所以我的问题是:在 Rails 5 的后台运行这个进程的最佳方式是什么?我显然不想强制我的用户等待一整分钟才能在应用程序中导航,我也不希望应用程序在浏览器等待服务器响应时超时。那么处理这个问题的最佳方法是什么?我需要一个可以异步发出请求的框架吗?如果有,是哪一个? (如果它不需要太多的依赖关系并且我可以继续使用 ActiveRecord,我会更喜欢)。

我并没有真正使用 ActionCable 或 AJAX 做太多工作,但如果他们能以任何方式完成工作,那么我会很高兴知道如何。

理想情况下,一旦该过程完成,我应该能够在应用程序内向用户发送通知

view.html.erb:

# Button the user presses to execute the algorithm
<%= link_to 'execute algorithm', algorithm_path(@variable), :method => :put %>

my_controller.rb:
def button_method
Object.execute_algorithm(@variable)
redirect_to :back
end

对象.rb:
def self.execute_algorithm(variable)
# Logic
end

最佳答案

Rails 使用 ActiveJob ,它允许您将昂贵的任务排队并在后台运行它们。它们使用起来非常简单。

拳头,您可以使用 rails 生成器创建一个:

rails generate job slow_algorithm

...这将在 app/jobs/slow_algorithm_job.rb 下创建工作.在那里,您可以实现您的算法逻辑。

排队工作同样简单,只需在您的 Controller 中完成:
SlowAlgorithmJob.perform_later

您需要介绍的最后一件事是设置实际运行作业的排队后端。 Rails 支持其中的几个。可能最简单的设置是 delayed_job ,但如果您正在寻找更具可扩展性的东西,我建议您查看 Sidekiq .

编辑:如何通知用户工作完成?

为了做到这一点,您显然必须以某种方式跟踪任务的进度。一个可能的方向是创建一条记录,我们称之为 Task。 ,它代表你的算法的一次调用。

当用户触发应将作业排队的操作时,将创建状态为 pending 的任务记录,然后 before_performafter_perform作业 Hook 可用于移动 Task状态为 running然后到 completed .
after_perform hook 可以用来通知客户。该应用程序将如何执行此操作取决于您。例如,Dropbox 在下载大量文件时使用类似的系统。他们排队工作,压缩文件,然后在工作完成后发送带有下载链接的电子邮件。

另一种方法是使用应用内通知系统。

最后,要在不需要用户刷新页面的情况下弹出通知,您必须使用 ActiveCable并再次使用 after_perform 将通知推送回用户钩。

关于ruby-on-rails - 在 Rails 5 中运行后台进程的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com