加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:57:23 所属栏目:百科 来源:网络整理
导读:我有一个Web应用程序,我需要执行一个需要一段时间才能完成的过程(通常为1分钟). 我将尝试简要解释一下:在我的应用程序中,我有一个算法,它根据一堆参数(主要是日期)将外键分配给一组对象.当用户按下我的应用程序内的指定按钮时,执行控制器方法.在该方法中,我
我有一个Web应用程序,我需要执行一个需要一段时间才能完成的过程(通常为1分钟).

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

所以我的问题是:在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

Object.rb:

def self.execute_algorithm(variable)
  # Logic
end

解决方法

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

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

rails generate job slow_algorithm

…将在app / jobs / slow_algorithm_job.rb下创建一个作业.在那里,您可以实现您的算法逻辑.

排队工作同样简单,只需在您的控制器中执行:

SlowAlgorithmJob.perform_later

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

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

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

当用户触发应该排队作业的操作时,创建状态为pending的任务记录,然后可以使用before_perform和after_perform作业挂钩将任务状态移动到运行然后再完成.

after_perform hook可用于通知客户.应用程序将如何实现,取决于您.例如,Dropbox在下载大量文件时使用类似的系统.他们排队工作,拉链文件,然后在作业完成后发送带有下载链接的电子邮件.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读