【发布时间】:2014-04-29 11:31:47
【问题描述】:
我已将 sidekiq 设置为在 after_commit 之后运行,但它在 ActiveRecord::RecordNotFound: Couldn't find User with id=42635 的情况下失败(接近)100%。
一直以为是连接错了redis数据库,但是打开retry: true发现10分钟左右终于成功了。
这很奇怪,因为我可以在管理面板中看到我们的用户 ID 失败,但 sidekiq 仍然会失败一段时间,然后最终重试会起作用。我不知道是什么原因造成的,我想让它在第一次尝试时成功。
编辑: 使用 AWS,下面的 sidekiq 调用和工作器示例:
在用户观察者中:
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
【问题讨论】:
-
我们需要更多详细信息才能有所帮助。你在用 Heroku 吗?专用服务器?什么是 SQL 服务器——PG、MySQL 等等?你能分享一些从 Sidekiq worker 中提取的代码吗?
-
@colinm - 向 sidekiq 工作人员更新了问题。
-
@Ashbury 我也有同样的问题。我也在使用
after_commit,但 Sidekiq 失败了。你解决了吗? -
我无法再访问 repo,但我认为问题是 redis/sidekiq 太快了,他们在 db 上的所有内容更新之前就完成了工作(我知道你正在使用 after_commit ,但也许是相关的模型?)对不起,我不记得了。您可以尝试 .perform_in(5.seconds) 来诊断是否是问题所在。
-
@Ashbury 我输入了
perform_in(60.seconds),但仍然没有找到错误。我什至可以在 Sidekiq Web 中看到计划的作业并连接到 Rails 控制台并查找对象并可以找到它,但是 Sidekiq 失败了......在我自己证明对象存在之后
标签: ruby-on-rails redis sidekiq