Sidekiq извлекает противоречивые данные

#ruby-on-rails #postgresql #sidekiq

#ruby-on-rails #postgresql #sidekiq

Вопрос:

 class A
  ....
  def something
    if condition
      mark_completed
      // here I can see the object progress is completed
      CompletionStatsWorker.perform_async(self.id)
    end
  end

  def mark_completed
    self.update_attributes!(progress: 'completed')  
  end
end
 

В рабочем:

 class CompletionStatsWorker
  include Sidekiq::Worker

  def perform(id)
    obj = A.find(id)
    //here I'm getting the progress of the same object as 'progressing'
  end
end
 

Sidekiq каким-то образом извлекает старые данные, даже если они запускаются после успешного обновления поля. Я вижу, что объект updated_at не совпадает с фактическим updated_at значением. Пожалуйста, помогите

Ответ №1:

это может произойти из sidekiq -за того, что работает быстрее, чем передано в БД, вам следует добавить CompletionStatsWorker.perform_async(self.id) в after_commit обратный вызов или изменить метод на :

   def something
    if condition
      if mark_completed
        // here I can see the object progress is completed
        CompletionStatsWorker.perform_async(self.id)
      end
    end
  end
 

взгляните на документы sidekiq

Комментарии:

1. Привет, Олег, я пробовал оба. Странно то, что прогресс завершен до того, как я вызываю работника. Но внутри рабочего он снова показывает статус как прогрессирующий. Но в db он завершается сам.

2. вы можете попробовать, просто для проверки, после mark_completed метода add sleep 1 . Это то же самое в этом случае?