我使用Sidekiq和ActiveJob及其回调。一开始我想说我的问题听起来与这个问题非常相似:https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting#cannot-find-modelname-with-id12345但是我没有使用ActiveRecord回调。
我的服务有这样的方法:
def call
array_of_batches.each do |batch|
MyJob.perform_later(batch)
end
end
这意味着它会创建许多同时执行的作业。在我的工作中,我使用before_perform
和after_perform
回调,每个问题都有2个问题。
1:
before_perform do |job|
# do something
return if my_object.status == 'performed'
my_object.update(status: 'performed')
send_notification
end
在上面的情况中,经常发生的情况是,当几个作业同时运行时,我会发送几次通知,而不是只发送一次。在一些工作中,它会在第一个运行的工作中结束,而不是只运行一次。
2:
after_perform do |job|
my_object.decrement!(:count)
return unless my_object.count.zero?
my_object.update(status: 'finished')
send_notification
end
在上述情况下,发生递减不及时,因此对象状态未正确更新,并且永远不会发送通知。例如,当执行10个作业之前的count
值等于10
时,执行所有作业后count
属性等于2
或3
而不是0
因为我们应该每次都减少这个值。
有可能以某种方式修复这些案件吗? 干杯