如果我想同时处理多个作业,我很困惑应该如何处理。
我有一个rails API,其中一个任务是获取其他API。这个任务需要很长时间,因为它对其他api进行了很多调用。目前,我所做的是创建一个活动作业,并在有人想要启动此任务时调用perform_ later方法(从控制器(。然而,如果多个用户想要求运行此任务,我所理解的是,每个任务都将被逐一排队和处理,这是我不希望的,因为这意味着一些用户将不得不等待很长时间。
如果我有不同的用户要求这个特定的任务,我希望活动作业一次处理多个任务。
我应该如何继续
我试图从perform_ later方法切换到perform,但是当一个任务正在运行时,如果我试图调用rails api,我的请求将被挂起,直到第一个任务完成。如有任何澄清或帮助,我们将不胜感激。非常感谢。
Rails附带了一个名为ActiveJob的后台处理框架。它允许您告诉rails,您希望由另一个进程(而不是应用程序服务器(执行一段代码。由于有许多关于如何处理后台作业的选项,ActiveJob只是一个用于处理后台工作的API,实际工作由适配器完成,这与ActiveJob只是API的方式非常相似,对数据库的真正写入是由不同的适配器完成的,这些适配器知道如何与不同的DB通信。
开箱即用的Active Job将使用异步适配器,这对开发很有好处,因为它将在不需要额外设置的情况下启动工作程序(使用Concurrent Ruby(。糟糕的是,它只会让其中一名员工离职,这就是为什么你会看到你的工作一个接一个地被解雇。
异步适配器的设计目的不是一次运行多个工作进程,而且它在工作进程有时间执行作业时用于存储作业的队列没有持久化,因此每次重新启动服务器时都会丢失排队的作业。
您需要切换到另一个队列适配器,该适配器允许您旋转任意数量的工作人员,这样您就可以同时运行作业。如果您希望有很少的作业,并且不想增加项目的复杂性,我建议您使用延迟作业,因为它将使用您的数据库来存储作业队列。如果你希望一次有很多(数百(个作业排队,那么像Sidekiq或Resque这样的东西会更好,因为它们会将作业队列移动到Redis服务器。
每个适配器都有自己的启动工作程序的方式,因此请阅读您所使用的适配器的文档,以便根据需要启动尽可能多的工作程序。例如,延迟作业中的RAILS_ENV=production script/delayed_job -n 2 start