【发布时间】: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