如何防止重试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: false
advanced option:
class UpdateMailchimpWorker
include Sidekiq::Worker
sidekiq_options retry: false # ⇐ HERE
def perform(id)
UpdateMailchimpService.new.(id)
end
end
【讨论】:
感谢您的回答。sidekiq_options
将改变这个工人完全不能重试。但我想要的是当某些错误出现时,作业停止重试。但对于其他人,例如连接失败,它会重试作业。以上是关于如何防止重试sidekiq上的某些异常/错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ActiveJob 设置 Sidekiq 的重试次数?
tenacity发生异常/失败/错误时重试retry机制,Python