it-swarm.com.de

Sidekiq verarbeitet keine Warteschlange

Welche möglichen Gründe können Sidekiq verhindern, dass Jobs in der Warteschlange verarbeitet werden? Die Warteschlange ist voll. Die Protokolldatei sidekiq.log zeigt keinerlei Aktivität an. Die Warteschlange ist also voll, aber das Protokoll ist leer, und Sidekiq scheint keine Elemente zu verarbeiten. Es scheint keine Arbeiterverarbeitung zu geben. Starten Sie Redis neu oder spülen Sie es mit FLUSHALL oder FLUSHDB als ohne Wirkung. Sidekiq wurde mit gestartet 

bündel exec sidekiq -L log/sidekiq.log

und erzeugt die folgende Protokolldatei:

2013-05-30..Booting Sidekiq 2.12.0 using redis://localhost:6379/0 with options {}
2013-05-30..Running in Ruby 1.9.3p374 (2013-01-15 revision 38858) [i686-linux]
2013-05-30..See LICENSE and the LGPL-3.0 for licensing details.
2013-05-30..Starting processing, hit Ctrl-C to stop

Wie können Sie herausfinden, was falsch gelaufen ist? Gibt es versteckte Protokolldateien?

46
0x4a6f4672

Der Grund war in unserem Fall: Sidekiq sucht möglicherweise nach der falschen Warteschlange. Standardmäßig verwendet Sidekiq eine Warteschlange mit dem Namen "default". Wir haben zwei unterschiedliche Warteschlangennamen verwendet und in config/sidekiq.yml definiert

# configuration file for Sidekiq
:queues:
  - queue_name_1
  - queue_name_2

Das Problem ist, dass diese Konfigurationsdatei nicht automatisch geladen wird standardmäßig in Ihrer Entwicklungsumgebung (im Gegensatz zu database.yml oder thinking_sphinx.yml) durch einen einfachen bundle exec sidekiq-Befehl. So haben wir unsere Jobs in zwei bestimmten Warteschlangen geschrieben, und Sidekiq wartete auf Jobs in einer dritten (der Standardwarteschlange). Sie müssen den Pfad zur Konfigurationsdatei als Parameter über die Option -Coder --config übergeben:

bundle exec sidekiq -C ./config/sidekiq.yml

oder Sie können die Warteschlangennamen direkt übergeben (hier dürfen nach dem Komma keine Leerzeichen stehen):

bundle exec sidekiq -q queue_name_1,queue_name_2

Um das Problem herauszufinden, ist es hilfreich, die Option -v oder --verbose auch in der Befehlszeile zu übergeben oder :verbose: true in der sidekiq.yml-Datei zu verwenden. Alles, was in einer Konfigurationsdatei definiert ist, ist natürlich unbrauchbar, wenn die Konfigurationsdatei nicht geladen wird. Stellen Sie daher sicher, dass Sie zuerst die richtige Konfigurationsdatei verwenden.

116
0x4a6f4672

Wenn Sie über eine config/sidekiq.yml-Überprüfung verfügen, dass alle Warteschlangen dort definiert sind, überprüfen Sie diese Beispieldatei: https://github.com/mperham/sidekiq/blob/master/examples/config.yml

Wenn Sie Warteschlangennamen in der Befehlszeile oder in "Procfile" übergeben, ähnelt dies

bin/sidekiq -q queue1 -q queue2
bundle exec sidekiq -q queue1 -q queue2

Überprüfen Sie, ob alle Ihre Warteschlangen dort definiert sind.

Falls Sie sich nicht sicher sind, wie Ihre Warteschlangen heißen, können Sie dies mit dem folgenden Skript herausfinden:

require "sidekiq/api"
stats = Sidekiq::Stats.new
stats.queues
# {"production_mailers"=>25, "production_default"=>1}

Dann können Sie mit den Warteschlangen Dinge erledigen:

queue = Sidekiq::Queue.new("production_mailers")
queue.count
queue.clear
6
Edgar Ortega

Ich hatte gerade dieses Problem. Es stellte sich heraus, dass ich in meiner sidekiq.yml einen Syntaxfehler gemacht hatte

1
jellymann

In meinem Fall war Sidekiq gut in der Entwicklung, blieb aber in der Inszenierung hängen. Es war ein menschlicher Fehler in der Deploy-Konfiguration von capistrano. Ich habe den Pfad für sidekiq.yml in der Cap-Datei falsch eingestellt (gemeinsam statt aktuell).

Es ist lautlos gescheitert:

# Capfile

# WRONG:
set :sidekiq_config, -> { File.join(shared_path, 'config', 'sidekiq.yml') }
                                    ^^^^^^^^^^^
# RIGHT:
set :sidekiq_config, -> { File.join(current_path, 'config', 'sidekiq.yml') }
0
João Souza

Ich schlug eine Weile mit dem Kopf gegen eine Mauer, mein Problem war, dass sidekiq eine neuere Version von redis-server benötigte. Ich habe "bundle exec sidekiq" ausgeführt und das hat den Fehler aufgedeckt. Nachdem ich auf eine neuere Version von Redis-Server aktualisiert hatte, war es in Ordnung.

0
Elliott

Mein Problem war, dass ich einen configure_server hatte, aber nicht configure_client in meinem Initialisierer. Sie müssen beide haben:

Sidekiq.configure_server do |config|
  config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://127.0.0.1:6379/1') }
end

Sidekiq.configure_client do |config|
  config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://127.0.0.1:6379/1') }
end
0
Hackeron