ruby 为什么我的Sidekiq作业会因为模型的after_commit代码而失败?

ff29svar  于 2023-11-18  发布在  Ruby
关注(0)|答案(1)|浏览(69)

当我运行这个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

个字符


的数据

yxyvkwin

yxyvkwin1#

为什么after_commit被认为是这项工作的一部分?
因为它是create的一部分(实际上是save的一部分)。
有没有一种方法可以将after_commit代码从作业中分离出来?
通过使用insert跳过回调,如指南中所述
如果没有办法解耦,有没有更好的模式可以采用?
值得一提的是.这是确保作业是幂等的最佳实践。可以重试作业的原因有很多,包括您自己的应用逻辑,但也包括其他系统条件。在正常情况下,这可能就像先使用find_by一样简单(假设您的作业排队逻辑不太可能为相同的记录/数据创建许多作业),或者可能需要DB中的唯一约束和逻辑来挽救那里的故障。

相关问题