Ruby on rails 如何在不引发错误的情况下将sidekiq任务/作业标记为重试?
我使用Sidekiq队列处理与不可靠的第三方API的通信。由于此API通常一次关闭几分钟,然后再次备份,因此Sidekiq非常方便。当发生连接问题时,会引发一个错误,Sidekiq会将作业抛出队列中,等待一段时间后重试 我使用NewRelic不仅帮助调试崩溃,还用于监视。我的问题是,上述当前方法在NewRelic中产生了错误。如果第三方API关闭超过几分钟,错误计数累积到足以导致通过NewRelic发送通知 我只想在某个作业重试一定次数后,从我的工作人员那里引发一个错误。我正在使用Ruby on rails 如何在不引发错误的情况下将sidekiq任务/作业标记为重试?,ruby-on-rails,sidekiq,Ruby On Rails,Sidekiq,我使用Sidekiq队列处理与不可靠的第三方API的通信。由于此API通常一次关闭几分钟,然后再次备份,因此Sidekiq非常方便。当发生连接问题时,会引发一个错误,Sidekiq会将作业抛出队列中,等待一段时间后重试 我使用NewRelic不仅帮助调试崩溃,还用于监视。我的问题是,上述当前方法在NewRelic中产生了错误。如果第三方API关闭超过几分钟,错误计数累积到足以导致通过NewRelic发送通知 我只想在某个作业重试一定次数后,从我的工作人员那里引发一个错误。我正在使用sidekiq
sidekiq\u retries\u
来执行此操作。我的问题是,我不太确定在作业出错后如何在不引发错误的情况下将作业放回队列中
Sidekiq是否提供了将作业返回到队列、增加作业重试次数以及将其放置在那里直到其到期再次运行的工具,就好像在工人类中引发了异常一样?您引发了一个特定的错误,并告诉错误服务忽略该类型的错误。对于NewRelic:
以下是我为避免AirBrake出现故意重试错误所做的工作:
class TaskWorker
include Sidekiq::Worker
class RetryNotAnError < RuntimeError
end
def perform task_id
task = Task.find(task_id)
task.do_cool_stuff
if task.finished?
@log.debug "Task #{task_id} was successful."
return false
else
@log.debug "Task #{task_id} will try again later."
raise RetryNotAnError, task_id
end
end
end
类TaskWorker
包括Sidekiq::Worker
类RetryNotError<运行时错误
结束
def执行任务\u id
task=task.find(任务id)
任务,做些很酷的事情
如果任务完成了?
@log.debug“任务#{Task_id}已成功。”
返回错误
其他的
@log.debug“任务#{Task_id}将稍后重试。”
引发RetryNotError,任务id
结束
结束
结束
告诉Airbrake忽略它:
Airbrake.configure do |config|
config.ignore << 'RetryNotAnError'
end
Airbrake.configure do | config|
config.ignore引用了这篇文章,因为我想自己实现一些东西——目前还没有经过测试,但我希望这样做:
如果使用Sidekiq Enterprise,另一个选项可能是使用可选的附加错误类型集,这些错误类型将被视为Sidekiq::Limiter::OverLimit
违规
出于我的目的,我计划创建一个新的错误类,然后将其添加到配置中的列表中。以下是sidekiq ent代码(不在公共sidekiq repo中)中关于如何修改配置文件的注释:
# An optional set of additional error types which would be
# treated as a rate limit violation, so the job would automatically
# be rescheduled as with Sidekiq::Limiter::OverLimit.
#
# Sidekiq::Limiter.errors << MyApp::TooMuch
# Sidekiq::Limiter.errors = [Foo::Error, MyApp::Limited]
在作业中,我将拯救我不希望完全忽略的“预期”间歇性错误,然后将我添加到列表中的错误抛出,如下所示:
rescue RestClient::RequestTimeout => e
raise SoftRetryError.new(e.inspect)
end
如果SoftRetryError
错误导致超过20次重试,则它将开始发出一些噪音。错误名称待定:)
rescue RestClient::RequestTimeout => e
raise SoftRetryError.new(e.inspect)
end