【问题标题】:Sidekiq Job Fails in Production | NameError: uninitialized constantSidekiq 作业在生产中失败 | NameError:未初始化的常量
【发布时间】:2020-07-30 23:18:18
【问题描述】:

我有一个Expenditure 模型:

class Expenditure < ApplicationRecord
  multi_tenant :company
  after_commit :related_reindex

  def related_reindex
    ExpenditureRelatedReindex.perform_async(id)
  end
end

这是我的工人expenditure_related_reindex.rb:

class ExpenditureRelatedReindex
  include Sidekiq::Worker
  sidekiq_options :queue => :critical, :retry => true, :backtrace => true

  def perform(record_id)
    e = Expenditure.find(record_id)

    MultiTenant.with(e.company) do
      return unless e
      e.expenditure_items.each(&:reindex)
      e.children&.each(&:reindex)
    end
  end
end

重新索引可能需要一些时间,所以我希望将这些分拆到 SideKiq。我应该提一下多租户代码,但我认为这不是问题所在。更新记录后,我得到:

NameError: uninitialized constant ExpenditureRelatedReindex
Did you mean?  ExpenditureItemsHelper
  from sidekiq/processor.rb:268:in `const_get'
  from sidekiq/processor.rb:268:in `constantize'
  from sidekiq/processor.rb:132:in `block (5 levels) in dispatch'
  from sidekiq/rails.rb:43:in `block in call'
  from active_support/execution_wrapper.rb:87:in `wrap'
  from active_support/reloader.rb:73:in `block in wrap'
  from active_support/execution_wrapper.rb:87:in `wrap'
  from active_support/reloader.rb:72:in `wrap'
  from sidekiq/rails.rb:42:in `call'
  from sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
  from sidekiq/processor.rb:257:in `stats'
  from sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
  from sidekiq/job_logger.rb:13:in `call'
  from sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
  from sidekiq/job_retry.rb:78:in `global'
  from sidekiq/processor.rb:124:in `block in dispatch'
  from sidekiq/logger.rb:10:in `with'
  from sidekiq/job_logger.rb:33:in `prepare'
  from sidekiq/processor.rb:123:in `dispatch'
  from sidekiq/processor.rb:162:in `process'
  from sidekiq/processor.rb:78:in `process_one'
  from sidekiq/processor.rb:68:in `run'
  from sidekiq/util.rb:15:in `watchdog'
  from sidekiq/util.rb:24:in `block in safe_thread'

我什至取出了整个“执行”代码块,即工人没有做任何事情来确认我没有某种回归调用等。我确认我的其他工人解雇并处理得很好。检查了明显的拼写错误——此时我的头撞到了墙上。

更新

好的 - 我已经确认了一件事 - 如果我添加任何名称的新工人,这会触发相同的错误。我什至重新启动了整个生产服务器以确认整个代码已重新加载等。

【问题讨论】:

  • 很抱歉再次提出关闭和开启的问题,但如果这是一项新工作,您是否重新启动了 sidekiq? Sidekiq 仅在启动时加载一次类,因此在推送新作业时必须循环它。
  • 我刚刚检查了仪表板,该过程显示的开始时间与我过去的部署相同。甚至尝试重命名 Worker 以查看它是否是一些奇怪的复数名称。
  • 嗯......毕竟这可能是问题所在。在仪表板中,我停止了该过程,然后重新部署。现在似乎一切正常。我需要以某种方式将其添加到我的部署脚本中。

标签: ruby-on-rails sidekiq


【解决方案1】:

它最终成为 Redis(或者至少我的修复是相关的)。找到这篇文章:

https://github.com/mperham/sidekiq/issues/2834#issuecomment-184800981

这是一个 Redis 命名空间冲突。我的服务器确实也运行了 elasticsearch,所以这是有道理的。我不知道为什么老工人跑了,而新工人却失败了。我的修复看起来像这样:

config.redis = {
    url: ENV['REDIS_URL'],
    namespace: "some_namespace_different_for_each_app"
  }

你还需要redis-namespace gem BTW

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 2016-09-19
    • 2014-04-10
    • 2013-08-17
    • 2017-01-19
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多