Sidekiq在成功之前失败了很多

时间:2014-03-21 21:34:52

标签: ruby-on-rails redis sidekiq

我已经设置了sidekiq来运行after_commit,但它在100%的时间内ActiveRecord::RecordNotFound: Couldn't find User with id=42635失败(接近)。

我觉得它连接到错误的redis数据库的时间最长,但是当retry: true打开时,我发现它最终会在大约10分钟后成功。

非常奇怪,因为我可以在管理面板中看到我们的用户失败的ID,但是sidekiq仍然会失败一段时间,然后最终重试将起作用。我不知道是什么造成了这种情况,我想在第一次尝试时让它成功。

修改 使用AWS,示例sidekiq调用和下面的worker:

在UserObserver中:

  def after_commit(user)
    if user.created_at == user.updated_at
      @user = user
      identify_and_track
    end

...

def identify_and_track
  IdentifyAndTrackUserWorker.perform_async(@user.id)
end

Sidekiq工作人员:

class IdentifyAndTrackUserWorker
  include Sidekiq::Worker
  sidekiq_options retry: true

  def perform(user_id)
    @user = User.find user_id
    Analytics.identify(
      user_id: user_id,
      traits: { email:      @user.email,
                first_name: @user.first_name,
                last_name:  @user.last_name
              }
    )
  end
end

1 个答案:

答案 0 :(得分:1)

我遇到了与此问题非常相似的问题,并且已经发现Sidekiq,在其快速的性质中,正在执行Rails能够创建对象之前的工作。为了防止sidekiq失败,让Rails有时间创建对象是很有帮助的。

使用IdentifyAndTrackUserWorker.perform_in(1.minute, @user.id)而不是IdentifyAndTrackUserWorker.perform_async(@user.id)