【问题标题】:Sidekiq failing a lot before succeedingSidekiq 在成功之前失败了很多
【发布时间】: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


【解决方案1】:

我遇到了与这个问题非常相似的问题,并发现 Sidekiq 因其速度快的特性,在 Rails 能够创建对象之前执行了该工作。为了防止 sidekiq 失败,帮助 Rails 有时间创建对象。

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

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2021-07-21
    • 2017-10-31
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多