我已经设置了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
答案 0 :(得分:1)
我遇到了与此问题非常相似的问题,并且已经发现Sidekiq,在其快速的性质中,正在执行Rails能够创建对象之前的工作。为了防止sidekiq失败,让Rails有时间创建对象是很有帮助的。
使用IdentifyAndTrackUserWorker.perform_in(1.minute, @user.id)
而不是IdentifyAndTrackUserWorker.perform_async(@user.id)
。