如何防止重试sidekiq上的某些异常/错误

Posted

技术标签:

【中文标题】如何防止重试sidekiq上的某些异常/错误【英文标题】:How to prevent retrying for some Exception/Error on 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 作业。 【参考方案1】:

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

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

【讨论】:

嗨,迈克,感谢您的回答。 def 块可以视为开始块。 ***.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 将改变这个工人完全不能重试。但我想要的是当某些错误出现时,作业停止重试。但对于其他人,例如连接失败,它会重试作业。

以上是关于如何防止重试sidekiq上的某些异常/错误的主要内容,如果未能解决你的问题,请参考以下文章

如何防止哨兵捕获某些未捕获的异常和记录消息的事件?

polly异常重试熔断

如何使用 ActiveJob 设置 Sidekiq 的重试次数?

tenacity发生异常/失败/错误时重试retry机制,Python

tenacity发生异常/失败/错误时重试retry机制,Python

Azure 服务总线:通过具有内置重试策略的消息泵接收到的瞬时错误(异常)。为啥?