【问题标题】:Calling worker inside another worker with sidekiq,用 sidekiq 在另一个工人内部调用工人,
【发布时间】:2016-01-30 07:02:14
【问题描述】:

我在使用 sidekiq 调用另一个工人内部的工人时遇到问题。 我有两个工人,看起来像这样:

class UserExportWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_id)
    # code that exports user to external service via API
    UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id)
  end
end

class UserExportStatusWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_export_id, user_id)
    # code that check if exporting user to external service via API is finished
    if export.completed?
      user.update(status: 'exported')
    else
      UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id)
    end
  end
end

UserExportWorker 通过 API 将用户导出到某个外部服务并运行 UserExportStatusWorker,它将检查外部 API 中的导出是否已完成,如果未完成,则它将再次启动相同的工作程序,当导出完成时,它将更新用户状态列数据库。问题是即使导出到外部 API 成功,UserExportStatusWorker 也不会更新数据库中的用户。但是当我将代码更改为:

class UserExportWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_id)
    # code that exports user to external service via API
    UserExportStatusWorker.new.perform(user_export_id, user_id)
  end
end

class UserExportStatusWorker
  include Sidekiq::Worker

  sidekiq_options queue: :users, unique: true, retry: false

  def perform(user_export_id, user_id)
    # code that check if exporting user to external service via API is finished
    if export.completed?
      user.update(status: 'exported')
    else
      UserExportStatusWorker.new.perform(user_export_id, user_id)
    end
  end
end

我完全没有想法......为什么这不起作用?

【问题讨论】:

  • 是的,第二个例子工作正常......不,他们没有。在第二个示例中,我使用 new.perform 而不是 perfrom_in
  • 你确定UserExportStatusWorker 中的工作会被perform_in 排队吗?
  • 在sidekiq 中,我有可视化的用户界面,可以为我提供有关当前工作的信息。当我使用 perform_in 时,我在 sidekiq 管理面板中看到作业安排在 1 分钟内。但随后没有发生。作业从预定作业中消失,但成功完成作业的计数器没有改变
  • 如果你没有使用错误处理服务,我建议你暂时设置retry: true并观察UI中的重试队列,看看作业是否失败。我使用滚动条,但他推荐了一些 - github.com/mperham/sidekiq/wiki/Error-Handling
  • @Anthony,当我在 UserExportStatusWorker 中将 unique 更改为 false 时,一切正常。

标签: ruby-on-rails ruby multithreading sidekiq


【解决方案1】:

docs 中所述,理想情况下,要在 Worker 上重新启动,您应该引发错误,并让 sidekiq 重试它。

因此,在您的情况下,在您的 UserExportWorker 类中,您可以有一个方法来检查导出是否成功运行,如果没有,请引发自定义 ExportNotSuccessfulError

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2013-11-05
    • 2018-11-05
    • 2013-12-30
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多