【问题标题】:Access and Delete Dead Jobs in Sidekiq在 Sidekiq 中访问和删除死作业
【发布时间】:2015-10-03 03:26:10
【问题描述】:

我在生产环境中的 Docker 容器内运行 Sidekiq,但无法访问 Web UI。 Sidekiq 工作人员似乎失败了,我需要检查他们是否确实失败并删除或重试。

我在这里看到的不是 100%,而是使用 workers = Sidekiq::Workers.new 收集了工人,我在 rails 控制台中得到了这个结果,这让我相信我有一些死工作:

workers.each { |process_id, thread_id, work| puts "Worker #{work}\n\n" }

Worker {"queue"=>"default", "payload"=>{"retry"=>1, "queue"=>"default", "class"=>"PeopleWorker", "args"=>["<arg-1>", "55800c0161616600b5000000"], "jid"=>"08126d4162242a26825ce2d3", "enqueued_at"=>1436800316.1181111, "error_message"=>"Error 503: The query timed out", "failed_at"=>1436816149.1032495, "retry_count"=>0}, "run_at"=>1436870942}

Worker {"queue"=>"default", "payload"=>{"retry"=>1, "queue"=>"default", "class"=>"PeopleWorker", "args"=>["<arg-1>", "55800c0161616600b5000000"], "jid"=>"16a68d843116702daad847d6", "enqueued_at"=>1436800316.2001767, "error_message"=>"Error 503: The query timed out", "failed_at"=>1436816221.2766316, "retry_count"=>0}, "run_at"=>1436874457}

Worker {"queue"=>"default", "payload"=>{"retry"=>1, "queue"=>"default", "class"=>"PeopleWorker", "args"=>["<arg-1>", "55800c0161616600b5000000"], "jid"=>"999ed8c1bb43192fa9a5c8b1", "enqueued_at"=>1436800312.3595853, "error_message"=>"Error 503: The query timed out", "failed_at"=>1436816142.493408, "retry_count"=>0}, "run_at"=>1436868587}

Worker {"queue"=>"default", "payload"=>{"retry"=>1, "queue"=>"default", "class"=>"PeopleWorker", "args"=>["<arg-1>", "55800c0161616600b5000000"], "jid"=>"91d2ece3dd75dd8a4c95baed", "enqueued_at"=>1436800316.4514835, "error_message"=>"Error 503: The query timed out", "failed_at"=>1436817504.064808, "retry_count"=>0}, "run_at"=>1436875742}

Worker {"queue"=>"default", "payload"=>{"retry"=>1, "queue"=>"default", "class"=>"PeopleWorker", "args"=>["<arg-1>", "55800c0161616600b5000000"], "jid"=>"af620ff8406c126f8f2df89c", "enqueued_at"=>1436800315.562301, "error_message"=>"Error 503: The query timed out", "failed_at"=>1436816221.7349763, "retry_count"=>0}, "run_at"=>1436872039}

Worker {"queue"=>"default", "payload"=>{"retry"=>1, "queue"=>"default", "class"=>"PeopleWorker", "args"=>["<arg-1>", "55800c0161616600b5000000"], "jid"=>"79601ece1f09a7721881bb0b", "enqueued_at"=>1436800316.3225756, "error_message"=>"Error 500: GC overhead limit exceeded", "error_class"=>"Tripod::Errors::BadSparqlRequest", "failed_at"=>1436817517.111997, "retry_count"=>0}, "run_at"=>1436876319}

=> ["1cc9c3e7af3e:104", "1cc9c3e7af3e:117", "1cc9c3e7af3e:130", "1cc9c3e7af3e:150", "1cc9c3e7af3e:164", "1cc9c3e7af3e:191", "1cc9c3e7af3e:210", "1cc9c3e7af3e:224", "1cc9c3e7af3e:250", "1cc9c3e7af3e:263", "1cc9c3e7af3e:290", "1cc9c3e7af3e:311", "1cc9c3e7af3e:323", "1cc9c3e7af3e:350", "1cc9c3e7af3e:91"]

根据htop,目前有 15 个 Sidekiq 进程正在运行,因此很好奇这些结果究竟发生了什么。

  1. 我的理解是否正确,因为在执行过程中遇到异常,这些作业处于死队列中?
  2. 既然如此,我应该强制重试这些作业,还是应该删除它们?我没有理由认为他们会再次失败。

【问题讨论】:

    标签: ruby-on-rails redis sidekiq fuseki


    【解决方案1】:

    请通读 Sidekiq API,包括 Sidekiq::RetrySet 和 Sidekiq::DeadSet。

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

    遇到异常的作业会进入 RetrySet,以便可以自动重试。

    【讨论】:

    • 所以要清楚 - 你是说这些被卡住了,因为我没有在工作人员中包含Sidekiq::RetrySet,所以不能重试这些工作?或者仅仅是这些作业在某个时候遇到了异常,因此即使它们现在正在重试过程中也会被存储?
    • Sidekiq内置重试系统;你不需要做任何事情 - 它只是工作。 github.com/mperham/sidekiq/wiki/Error-Handling
    • 明确地说,RetrySet 和sidekiq/api 中的所有其他类是Web UI 用来执行其所有操作的。如果您可以在 Web UI 中手动执行此操作,则可以使用 API 以编程方式执行此操作。
    • 好的,谢谢。我认为我的问题是这些是长期运行的工作,并且在 30 分钟的默认设置后它们就消失了。他们正在完成,只是没有出现在队列或sidekiq-status 方法中。
    【解决方案2】:

    请使用此命令清除“死亡”作业统计信息

    Sidekiq::DeadSet.new.clear
    

    【讨论】:

      猜你喜欢
      • 2021-04-12
      • 2021-01-21
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多