【问题标题】:Delayed Job debug on production logs生产日志上的延迟作业调试
【发布时间】:2016-08-09 00:33:17
【问题描述】:

我正在使用Rails 5DelayedJob 设置后台任务,用于简单的电子邮件通知。

查看我的生产日志,发现以下项目:

[2016-08-05T20:22:15.094172 #10616] DEBUG -- : 
Delayed::Backend::ActiveRecord::Job Load (1.0ms)  UPDATE "delayed_jobs"
SET locked_at = '2016-08-06 10:22:15.092656', locked_by = 'delayed_job 
host:jiably pid:10616' WHERE id IN (SELECT  "delayed_jobs"."id" FROM 
"delayed_jobs" WHERE ((run_at <= '2016-08-06 10:22:15.091986' AND 
(locked_at IS NULL OR locked_at < '2016-08-06 06:22:15.092073') OR 
locked_by = 'delayed_job host:vps-server-name pid:10616') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *

队列中没有作业,当我测试我的应用程序的电子邮件通知时,作业似乎处理得很好。

这正常吗?它似乎经常重复并添加到日志文件中。我确实有 logrotate 设置,但不确定这是我做的配置还是错过的配置。

感谢您对此有所了解。

【问题讨论】:

    标签: ruby-on-rails delayed-job ruby-on-rails-5


    【解决方案1】:

    您可能会看到 Delayed::Job 问题 477 here。编辑:我知道你说这发生在生产中。需要修改修复程序或您的配置以匹配该问题。

    如果是这样,修复就在那里。我在这里实现了 config/initializers/delayed_job_config.rb (注意我已经实现了分期):

    Delayed::Worker.max_attempts = 5
    Delayed::Worker.delay_jobs = !Rails.env.test?
    Delayed::Worker.sleep_delay = 10
    Delayed::Worker.default_priority = 100
    
    # Prevent excessive logging every 5 seconds when Logger level < WARN
    # https://github.com/collectiveidea/delayed_job/issues/477
    if %w(development staging).include? Rails.env
      module Delayed
        module Backend
          module ActiveRecord
            class Job
              class << self
                alias_method :reserve_original, :reserve
                def reserve(worker, max_run_time = Worker.max_run_time)
                  previous_level = ::ActiveRecord::Base.logger.level
                  ::ActiveRecord::Base.logger.level = Logger::WARN if previous_level < Logger::WARN
                  value = reserve_original(worker, max_run_time)
                  ::ActiveRecord::Base.logger.level = previous_level
                  value
                end
              end
            end
          end
        end
      end
    end
    

    【讨论】:

    • 这个线程安全吗?据我了解,AcitveRecord::Base.logger 将与 AR 类的所有其他实例共享
    • @Ruslan 看来您肯定是正确的,尤其是在引用的问题中提到了它。我应该这么说的。我现在没有时间做深入的分析。您预计会有什么影响?
    • 我自己没有做过任何分析。但是我假设如果AR 在切换发生时运行查询(在工作人员之外),那么它将不会被记录。时间必须非常准确
    • 噩梦燃料。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2011-01-12
    • 2016-10-10
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多