ruby-on-rails 如何确保一个sidekiq worker在Ruby on Rails中完成后运行

3qpi33ja  于 4个月前  发布在  Ruby
关注(0)|答案(2)|浏览(83)

我正在开发一个Ruby on Rails应用程序,该应用程序使用Sidekiq(版本6.5.8)进行后台作业处理。在我的应用程序中,我有一个特定的要求:我需要确保第二个Sidekiq worker仅在第一个worker成功完成任务后才开始执行。
为了提供更多的上下文,我在应用程序中设置了一个服务,用于启动第一个worker。此worker负责更新某些客户信息。此外,还有一个worker用于向用户发送电子邮件,指示更新过程已完成。我的目标是建立一个顺序工作流,在此工作流中,一旦第一个worker完成其工作,第二个worker将自动调用。
需要注意的是,我的应用程序的运行配置涉及多个工作线程的并发执行。在这种设置下,在服务中使用perform_worker c调用两个工作线程并不是一个可行的解决方案,因为它可能无法保证所需的执行顺序。
此外,所讨论的更新服务是由用户通过应用程序的一个端点调用的。因此,它是用户触发的,需要一种机制来确保只有在第一个工作者成功完成其任务后才执行第二个工作者。
考虑到Sidekiq的并发特性和更新服务的用户触发特性,我如何在Rails应用程序中实现Sidekiq worker的这种有序执行?
我尝试实现一个回调函数'after_perform',但它似乎与我当前的Sidekiq版本(6.5.8)不兼容。此外,如果可能的话,我不希望将这两个工作线程紧密耦合。

alen0pnh

alen0pnh1#

最直接的方法是在第一个作业中调用第二个作业:

class UpdateCustomerInfoJob
  include Sidekiq::Job

  def perform(data)
    # Some logic to update the customer info

    # Once it reaches this point, it means
    # the job completed successfully and will
    # execute the second job.
    EmailCustomerJob.perform_async(
      email: data[:email]
    )
  end
end

字符串
据我所知,没有其他模式/配置可以纯粹在Sidekiq中完成,以顺序执行作业。这也是基于Sidekiq的常见问题:
Sidekiq是为异步处理作业而设计的,这些作业可以在隔离和相互独立的情况下完成。
如果你真的想这样做,你可以尝试集成一个第三方gem,比如sidekiq-sequence

# sequence class
class UpdateCustomerSequence < Sidekiq::Sequence::Base
  step UpdateCustomerInfoJob
  step EmailCustomerJob
end

# execute sequence
UpdateCustomerSequence.new(
  email: '[email protected]',
  first_name: 'John',
  last_name: 'Doe'
)


然而,你需要考虑这些好处是否值得额外的依赖。另外,只是一个警告:gem没有被积极维护。

htrmnn0y

htrmnn0y2#

Sidekiq Pro的Batches with a:success回调也可以解决这个问题。
https://github.com/sidekiq/sidekiq/wiki/Complex-Job-Workflows-with-Batches

相关问题