提问人:aaronkelton 提问时间:11/17/2023 最后编辑:user3402754aaronkelton 更新时间:11/18/2023 访问量:67
为什么我的 Sidekiq 作业因模型的after_commit代码而失败?
Why does my Sidekiq job fail from a model's after_commit code?
问:
当我运行这个 Sidekiq 作业时,它成功创建了 Foo 记录。但是由于 Foo 引发了错误,整个作业失败并最终进入死作业队列。如果我修复错误并重新运行作业,它将创建另一个 Foo 记录(或在重试😬时这样做),这是不可取的。after_commit
after_commit
我希望在成功创建 Foo 记录后成功完成。该逻辑不应导致作业失败。PerformAndCreateFooJob
after_commit
- 为什么被认为是这份工作的一部分?
after_commit
- 有没有办法将代码与作业解耦?
after_commit
- 如果没有办法解耦,有没有更好的模式可以采用?
class PerformAndCreateFooJob
include Sidekiq::Job
sidekiq_options retry: 0
def perform = Foo.create
end
class Foo < ApplicationRecord
after_commit -> () { raise }
end
答:
1赞
smathy
11/18/2023
#1
为什么被认为是这份工作的一部分?
after_commit
因为它是 的一部分(实际上是 的一部分),你正在调用它。create
save
有没有办法将代码与作业解耦?
after_commit
如果没有办法解耦,有没有更好的模式可以采用?
值得补充...最佳做法是确保作业是幂等的。可以重试作业的原因有很多,包括你自己的应用逻辑,以及其他系统条件。在正常情况下,这可能像使用第一个一样简单(假设您的作业队列逻辑不太可能为相同的记录/数据创建多个作业),或者可能需要在数据库和逻辑中有一个唯一的约束来挽救那里的故障。find_by
评论
raise
after_commit
after_commit
raise
after_commit
after_commit
create
rescue
after_commit
after_commit