Sidekiq在成功之前失败很多

Ash*_*ury 5 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
Run Code Online (Sandbox Code Playgroud)

...

def identify_and_track
  IdentifyAndTrackUserWorker.perform_async(@user.id)
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

scl*_*m72 1

我遇到过与此非常相似的问题,并且发现 Sidekiq 因其快速性而在 Rails 能够创建对象之前执行了该作业。为了防止 sidekiq 失败,它是帮助器,给 Rails 时间来创建对象。

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