当我运行这个Sidekiq作业时,它成功地创建了Foo记录。但是因为Foo的after_commit
引发了一个错误,整个作业失败并最终进入死作业队列。如果我修复了after_commit
错误并重新启动作业,它将创建另一个Foo记录(或者在重试重新启动时这样做),这是不可取的。
我希望在成功创建Foo记录之后PerformAndCreateFooJob
能够成功完成。after_commit
逻辑不应该导致作业失败。
- 为什么
after_commit
被认为是这项工作的一部分? - 有没有一种方法可以将
after_commit
代码从作业中分离出来? - 如果没有办法解耦,有没有更好的模式可以采用?
class PerformAndCreateFooJob
include Sidekiq::Job
sidekiq_options retry: 0
def perform = Foo.create
end
个字符
的数据
1条答案
按热度按时间yxyvkwin1#
为什么
after_commit
被认为是这项工作的一部分?因为它是
create
的一部分(实际上是save
的一部分)。有没有一种方法可以将
after_commit
代码从作业中分离出来?通过使用
insert
跳过回调,如指南中所述如果没有办法解耦,有没有更好的模式可以采用?
值得一提的是.这是确保作业是幂等的最佳实践。可以重试作业的原因有很多,包括您自己的应用逻辑,但也包括其他系统条件。在正常情况下,这可能就像先使用
find_by
一样简单(假设您的作业排队逻辑不太可能为相同的记录/数据创建许多作业),或者可能需要DB中的唯一约束和逻辑来挽救那里的故障。