Ruby on rails 用sidekiq呼叫另一名工人内部的工人,
我打电话给另一个有sidekiq的工人有问题。 我有两个工人,看起来像这样:Ruby on rails 用sidekiq呼叫另一名工人内部的工人,,ruby-on-rails,ruby,multithreading,sidekiq,Ruby On Rails,Ruby,Multithreading,Sidekiq,我打电话给另一个有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 UserExportStatus
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中的导出是否已完成,如果未完成,则将再次启动同一个worker,当导出完成时,将更新数据库中的用户状态列。问题是,即使导出到外部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
我完全没有主意了。。。为什么不起作用?理想情况下,要在工作进程上重新启动,您应该引发一个错误,并让sidekiq重试,如中所述
因此,在您的UserExportWorker类中,您可以有一个方法来检查导出是否成功运行,如果没有成功,则引发一个自定义ExportNotSuccessfulError是,第二个示例工作正常。。。不,他们没有。在第二个示例中,我使用new.perform而不是perfrom_inare,您在
UserExportStatusWorker
中的某些作业将与perform_一起排队在中?在sidekiq中,我有一个可视化的UI,可以提供有关当前作业的信息。当我在中使用perform_时,我在sidekiq管理面板中看到作业计划在1分钟内完成。但这一切都不会发生。作业从计划作业中消失,但成功完成作业的计数器未更改如果您未使用错误处理服务,我建议您临时设置retry:true
,并查看UI中的重试队列,以查看作业是否失败。我使用rollbar,但他推荐了一些-@Anthony,当我在UserExportStatusWorker中将unique更改为false时,一切都按预期进行。