Sidekiq在工作中重试计数

Cim*_*imm 11 ruby jobs sidekiq

有没有办法获得当前工作的重试次数?

x重试后,我希望工作停止,而不是崩溃.我想问一下perform方法中的重试次数,所以如果重试次数等于x,我可以简单地返回.

def perform(args)
  return if retry_count > 5
  ...
end
Run Code Online (Sandbox Code Playgroud)

使用Sidekiq 2.12.

编辑

我(不是OP)有同样的问题,但原因不同.如果正在重试该作业,我想进行额外的健全性检查以确保需要该作业,并且如果不再预期成功则退出重试,因为在排队之后外部发生了更改.

那么,有没有办法获得当前工作的重试次数?目前的答案只是建议你可以绕过需要的方式,或者可以从工作之外获得它.

小智 15

这可以通过添加sidekiq中间件来将msg ['retry_count']设置为作业类的实例变量来实现.

添加一个中间件(在Rails中,它通常是文件/config/initializers/夹中的文件),如下所示:

class SidekiqMiddleware
    def call(worker, job, queue)
        worker.retry_count = job['retry_count'] if worker.respond_to?(:retry_count)
        yield
    end
end

Sidekiq.configure_server do |config|
    config.server_middleware do |chain|
        chain.add SidekiqMiddleware
    end
end
Run Code Online (Sandbox Code Playgroud)

在你的工作中:

include Sidekiq::Worker
attr_accessor :retry_count

def retry_count
  @retry_count || 0
end

def perform(args)
  return if retry_count > 5
  ...
end
Run Code Online (Sandbox Code Playgroud)


blo*_*tto 7

你不需要直接处理这个逻辑来完成你想要的.简单地为你的工人添加一些配置sidekiq_options.基于您在下面的评论"阻止Sidekiq将工作移动到死亡工作队列"

 class MyWorker  
     include Sidekiq::Worker
     sidekiq_options :retry => 5, :dead => false

      def perform
          #do some stuff
      end
 end
Run Code Online (Sandbox Code Playgroud)

然后工作应该重试5次并优雅地失败.此外,如果您想在执行5次重试后执行代码块,则该工作程序会调用一个方法sidekiq_retries_exhausted来执行某些自定义日志记录等操作.

  • 谢谢,但在 5 次尝试后,这将最终成为“失败”的工作,我想尝试 5 次,如果不起作用,就停止而不引发错误。那不一样。`sidekiq_retries_exhausted` 是同样的事情,已经太晚了,工作*失败*。我想在它失败之前阻止它。 (2认同)

ale*_*nde 1

您可以使用 Sidekiq API 访问重试:

https://github.com/mperham/sidekiq/wiki/API#retries

找到您需要的作业并用于job['retry_count']获取重试次数。

  • 谢谢,但可以在作业*运行时*在*内部*进行重试。此时该作业已不再位于 RetrySet 中,因为它是活动的、正在运行的作业。 (14认同)