Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在不引发错误的情况下将sidekiq任务/作业标记为重试?_Ruby On Rails_Sidekiq - Fatal编程技术网

Ruby on rails 如何在不引发错误的情况下将sidekiq任务/作业标记为重试?

Ruby on rails 如何在不引发错误的情况下将sidekiq任务/作业标记为重试?,ruby-on-rails,sidekiq,Ruby On Rails,Sidekiq,我使用Sidekiq队列处理与不可靠的第三方API的通信。由于此API通常一次关闭几分钟,然后再次备份,因此Sidekiq非常方便。当发生连接问题时,会引发一个错误,Sidekiq会将作业抛出队列中,等待一段时间后重试 我使用NewRelic不仅帮助调试崩溃,还用于监视。我的问题是,上述当前方法在NewRelic中产生了错误。如果第三方API关闭超过几分钟,错误计数累积到足以导致通过NewRelic发送通知 我只想在某个作业重试一定次数后,从我的工作人员那里引发一个错误。我正在使用sidekiq

我使用Sidekiq队列处理与不可靠的第三方API的通信。由于此API通常一次关闭几分钟,然后再次备份,因此Sidekiq非常方便。当发生连接问题时,会引发一个错误,Sidekiq会将作业抛出队列中,等待一段时间后重试

我使用NewRelic不仅帮助调试崩溃,还用于监视。我的问题是,上述当前方法在NewRelic中产生了错误。如果第三方API关闭超过几分钟,错误计数累积到足以导致通过NewRelic发送通知

我只想在某个作业重试一定次数后,从我的工作人员那里引发一个错误。我正在使用
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