Sidekiq + ActiveJob回调运行得太快

时间:2017-01-05 22:02:59

标签: ruby-on-rails sidekiq rails-activejob

我使用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_performafter_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属性等于23而不是0因为我们应该每次都减少这个值。

有可能以某种方式修复这些案件吗? 干杯

0 个答案:

没有答案