【问题标题】:Active Job simultaneously jobs - rails 5Active Job 同时工作 - rails 5
【发布时间】:2021-06-27 06:41:17
【问题描述】:

如果我想同时处理多个工作,我很困惑应该如何进行。

我有一个 Rails API,其中一项任务是获取其他 API。此任务需要很长时间,因为它会多次调用其他 API。 目前我所做的是创建一个活动作业并在有人想要启动此任务时调用 perform_later 方法(从控制器)。 但是,如果多个用户想要求该任务运行,我的理解是每个任务都会被排队并一个一个地处理,这我并不真正想要,因为这意味着一些用户将不得不等待很长时间。

如果我有不同的用户要求执行此特定任务,我想要的是,活动作业一次处理多个任务。

我应该如何进行?

我尝试从 perform_later 方法切换到执行,但是当一个任务正在运行时,如果我尝试调用我的 rails api,我的请求将暂停,直到第一个任务完成。 任何澄清或帮助表示赞赏。 谢谢!

【问题讨论】:

  • 据我所知,主动作业是实现后台作业的唯一方法。尝试使用“sidekiq”适配器。
  • 您需要多个后台(或 sidekiq)工作人员来并行处理这些多个进程。我想您正在本地机器上测试您的代码并且您还没有配置您的应用程序。 This article 可以帮到你。
  • 我还建议使用queue adapter,例如Sidekiq。 Sidekiq 中的concurrency 设置允许您指定可以同时运行多少个作业,并且生成多个工作人员还可以让您同时运行更多作业(成本)。

标签: ruby-on-rails ruby rails-activejob


【解决方案1】:

Rails 带有一个名为Active Job 的后台处理框架。它可以让你告诉 Rails 你想要一些代码由另一个进程(而不是应用服务器)执行。由于关于如何处理后台作业有很多选项,ActiveJob 只是一个用于处理后台作业的 API,而实际工作由 Adapter 完成,非常类似于 ActiveJob 只是一个 API 和真正写入数据库由知道如何与不同数据库通信的不同适配器完成。

开箱即用的 Active Job 将使用 Async 适配器,这有利于开发,因为它无需额外设置即可启动一个工作器(使用 Concurrent Ruby)。不好的部分是它只会启动其中 1 个工人,这就是为什么你会看到你的工作被一个接一个地接走。

异步适配器的设计目的不是一次运行多个工作器,并且它用于在工作器有时间执行它们时存储您的作业的队列不会持久化,因此您每次都会丢失排队的作业重启你的服务器。

您将需要切换到另一个队列适配器,该适配器可让您启动任意数量的工作人员,以便您可以同时运行作业。如果您希望有很少的工作并且不想增加项目的复杂性,我建议使用Delayed Job,因为它将使用您的数据库来存储工作队列。如果您希望一次有许多(数百个)作业排队,那么像 Sidekiq 或 Resque 这样的东西会更好,因为它们会将作业队列移动到 Redis 服务器。

每个适配器都有自己的启动 worker 的方式,因此请阅读您所使用的适配器的文档,以便根据需要启动尽可能多的 worker。例如。 RAILS_ENV=production script/delayed_job -n 2 start 在 DelayedJob 中

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 2020-03-16
    • 2014-11-06
    • 2015-07-07
    • 2015-03-03
    • 1970-01-01
    • 2019-01-24
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多