Techioz Blog

Sidekiq と Rails での初期化されていない定数エラー

概要

最近、初期化されていない一定のエラーが大量に発生するようになりましたが、その理由がわかりません。以下に具体的な例を示します。この例では、ジョブ内からジョブを呼び出しています。しかし、他の多くのジョブでも同様の初期化されていない定数エラーが発生します。すべてのジョブはアプリ/ジョブ内にあります。何かが足りないのでしょうか? Sidekiq は最近まで問題なく動作していました。

Heroku キャッシュを削除し、Sidekiq でのすべての再試行を強制終了しましたが、依然としてこれらの問題が発生します。ここには本当に奇妙なことがあります。 Sidekiq ジョブに関連する別のエラーで、「引数の数が間違っています (2 が指定され、1 が期待されます)」というエラーが発生します。数週間前に、2 つの引数を受け取るように問題の関数を更新しました。 Sidekiq がコードベースのキャッシュされたバージョンに何らかの理由でスタックしている可能性はありますか?

Rubyのバージョン:ruby 2.5.3p105 Sidekiq バージョン: 6.0.7

app/jobs/process_email_notifications_job.rb

class ProcessEmailNotificationsJob < ApplicationJob
  queue_as :default

  def perform
    user_ids = UserNotification.where(is_read: false).pluck(:user_id).uniq
    user_ids.each do |user_id|
      ProcessIndividualEmailNotificationsJob.perform_later user_id
    end
  end
end

app/jobs/process_individual_email_notifications_job.rb

class ProcessIndividualEmailNotificationsJob < ApplicationJob
queue_as :default
  def perform(user_id)
     ...
  end
end

エラーメッセージ:

2020-05-06T20:07:45.720Z pid=56028 tid=owp0sdcm8 DEBUG: enqueued retry: {"retry":true,"queue":"production_default","class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","wrapped":"ProcessIndividualEmailNotificationsJob","args":[{"job_class":"ProcessIndividualEmailNotificationsJob","job_id":"4b31bc4f-d034-4190-b24f-d0464cf81df0","provider_job_id":null,"queue_name":"production_default","priority":null,"arguments":[988],"executions":0,"locale":"en"}],"jid":"0ecc861f5870a7b9a70f176f","creat
4:07:45 PM sidekiq.1 |  >  ed_at":1588794273.2726498,"enqueued_at":1588795006.4009435,"error_message":"uninitialized constant ProcessIndividualEmailNotificationsJob\nDid you mean?  ProcessEmailNotificationsJob","error_class":"NameError","failed_at":1588794279.9911764,"retry_count":5,"retried_at":1588795006.763224}

イニシャライザ:

require 'sidekiq'
require 'sidekiq/web'

Sidekiq.configure_client do |config|
  config.redis = { :size => 5 }
end

Sidekiq.configure_server do |config|
  config.redis = { :size => 25 }
end

Sidekiq::Web.set :sessions, false

サイドキック.yml

:concurrency: 18

development:
  :verbose: true
  :queues:
    - [development_priority, 2]
    - development_default
    - development_mailers

staging:
  :queues:
    - [staging_priority, 2]
    - staging_default
    - staging_mailers

production:
  :queues:
    - [production_priority, 2]
    - production_default
    - production_mailers

解決策

わかりました。ここで提案されているように、redis のsidekiqに名前空間を追加することで問題を解決したようです: https://github.com/mperham/sidekiq/issues/2834