【问题标题】:How to prevent retrying for some Exception/Error on sidekiq如何防止重试sidekiq上的某些异常/错误
【发布时间】:2017-11-28 23:43:23
【问题描述】:

我有一个 sidekiq 工作人员,它将请求 3rd 方 api(Mailchimp) 并得到一些响应。有时它会响应 api gem 会引发错误的错误消息。

但是,这些错误是正常的,无需重试。所以我希望 Sidekiq 在出现这些错误时防止重试。

我尝试了一个简单的rescue,但它不会阻止 sidekiq 捕获引发的错误。

def preform(id)
  UpdateMailchimpService.new.(id)
rescue
  Mailchimp::ListInvalidBounceMemberError
end

有什么办法吗?谢谢

更新

终于发现我的问题是因为我们的部署工具坏了(部署失败但没有实现)。实际上,Sidekiq 将忽略任何已挽救的错误/异常,它们不会被重试并报告给 Bugsnag。

Bugsnag's documentation中,明确表示:

应该安装和配置 Bugsnag,任何未处理的异常都将被自动检测并出现在您的 Bugsnag 仪表板中。

github 上的这个post 没有明确的解释,所以这就是我对这个问题感到困惑的原因。

【问题讨论】:

  • “它不会阻止 sidekiq 捕获引发的错误” – 你的意思是什么?
  • @Stefan 这意味着 sidekiq 仍然知道这项工作导致了错误ListInvalidBounceMemberError,并将重试这项工作。
  • @Stephen 您的代码示例看起来无效。你能提供真实的例子吗?因为rescue 阻止我重试 Sidekiq 作业。

标签: ruby-on-rails ruby exception sidekiq mailchimp-api-v3.0


【解决方案1】:

您的假设/示例不正确。做普通的 Ruby 事情:挽救错误并忽略它。

def perform(id)
  begin
    UpdateMailchimpService.new.(id)
  rescue NormalError
    # job will succeed normally and Sidekiq won't retry it.
  end
end

【讨论】:

  • 嗨,迈克,感谢您的回答。 def 块可以视为开始块。 stackoverflow.com/questions/1542672/…
  • 我也尝试了你的解决方案,但错误仍然出现在我的 bugsnag 上(我认为它已重试)
  • 嗨,迈克,感谢您的确认,我刚刚发现我的部署工具有问题,所以工作人员没有成功部署。 Sidekiq 将忽略任何已获救的错误。谢谢你这么棒的宝石。
【解决方案2】:

使用retry: falseadvanced option

class UpdateMailchimpWorker
  include Sidekiq::Worker
  sidekiq_options retry: false # ⇐ HERE

  def perform(id)
    UpdateMailchimpService.new.(id)
  end
end

【讨论】:

  • 感谢您的回答。 sidekiq_options 将改变这个工人完全不能重试。但我想要的是当某些错误出现时,作业停止重试。但对于其他人,例如连接失败,它会重试作业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2012-04-05
  • 2020-06-17
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多