Sidekiq kann in mehreren Umgebungen bereitgestellt werden

(Siehe unten für meine detaillierte Konfiguration, die das Ergebnis von Henley Chius Antwort ist).

Ich habe versucht, mein Gehirn um Sidekiq-Bereitstellungen zu wickeln, und ich verstehe es nicht wirklich. Ich habe eine App mit einer Staging-Umgebung und einer Produktionsumgebung auf demselben Server. Alles, was ich über sidekiq-Bereitstellungen sehe, besagt im Grunde genommen "füge sidekiq / capistrano zu deiner Bereitstellungsdatei hinzu", also habe ich das getan. Und dann sind die Anweisungen "Hier ist eine YML-Datei mit Optionen", aber nichts scheint erklärt zu werden. Benötige ich Namespaces? Ich sehe das in einer Initialisierungsdatei, aber das scheint zu sein, außerhalb des Servers zu zeigen.

Ich habe es früher bereitgestellt, und jede Phase scheint sidekiq mit der richtigen Umgebung hochzufahren, aber beide werden in denselben Warteschlangen verarbeitet. Meine E-Mails aus der Produktion versuchten, vom Stage Sidekiq verarbeitet zu werden und versagten. Ich habe meine Bühne fürs Erste angehalten, aber irgendwann muss ich sie wieder benutzen. Ich hoffe, ich bin nicht dicht, ich habe wirklich versucht, das zu verstehen, und es fällt mir nur schwer, ein endgültiges "hier ist, wie es gemacht wird" zu finden.

Für das, was es wert ist, ist hier config / sidekiq.yml (die während der Bereitstellung gut geladen wird):

:concurrency: 5
:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
  - [carrierwave, 7]
  - [client_emails, 5]
  - [default, 3]
staging:
  :concurrency: 10
production:
  :concurrency: 25

Protokolldateien und PIDs scheinen am richtigen Ort zu sein, aber die Warteschlangen werden nur zusammengeführt. Jede Hilfe wäre toll!

Auch wenn es darauf ankommt:

Rails 3.2.11, passenger, nginx, rvm, Ubuntu 12.10, and Ruby 1.9.3
Detaillierte Konfiguration (Antwort):

Zuerst habe ich einen neuen Redis-Server an Port 7777 (oder einem anderen Port als dem Standard-6379) eingerichtet. Ziemlich viel folgte demRedis Quickstart-Anleitung dass ich das erste mal benutzt habe.

Dann habe ich die Initilizer-Datei erstellt. Dies hat sowohl die Client- als auch die Serverkonfiguration. Beides ist erforderlich, damit sidekiq mehrstufig funktioniert.

Beachten Sie, dass ich für die Einstellungen eine externe YAML-Datei verwende. ich benutzeSettingsLogic Damit es einfacher wird, aber Sie können es genauso einfach tunTun Sie dies selbst, indem Sie die Datei einschließen. Durch die Verwendung einer Yaml-Datei müssen wir unsere Umgebungen / Staging- oder Produktionsdateien nicht berühren.

# config/initializers/sidekiq.rb
server = Settings.redis.server
port = Settings.redis.port
db_num = Settings.redis.db_num
namespace = Settings.redis.namespace

Sidekiq.configure_server do |config|  
  config.redis = { url: "redis://#{server}:#{port}/#{db_num}", namespace: namespace  }
end

Ich benutze Passagier - dieFehlerbehebungsseite des sidekiq-Wikis empfiehlt eine Änderung des Setups bei Verwendung eines Einhorns oder Beifahrers, daher habe ich den Code für das Client-Setup dort hinzugefügt:

# config/initializers/sidekiq.rb (still)
if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    Sidekiq.configure_client do |config|
      config.redis = { url: "redis://#{server}:#{port}/#{db_num}", namespace: namespace }
    end if forked
  end
end

Dies ist meine Einstellungsdatei (offensichtlich Werte geändert):

#config/settings.yml
defaults: &defaults
  redis: &redis_defaults
    server: 'localhost'
    port: 6379
    db_num: 0
    namespace: 'sidekiq_development'

development:
  <<: *defaults

test:
  <<: *defaults

staging:
  <<: *defaults
  redis:
    <<: *redis_defaults
    port: 8888
    namespace: 'sidekiq_staging'

production:
  <<: *defaults
  redis:
    <<: *redis_defaults
    port: 7777
    namespace: 'sidekiq_production'

Ich habe festgestellt, dass das Hinzufügen des Namespace zur Datei config / sidekiq.yml nicht funktioniert - sidekiq würde bei der Bereitstellung über den richtigen Port gestartet, aber tatsächlich nichts verarbeiten. Da das Wiki jedoch die Verwendung eines Namespaces empfiehlt, habe ich ihn letztendlich nur der Init-Datei hinzugefügt.

Ich hoffe, dass dies für andere hilfreich ist, da dies für mich sehr schwer zu verstehen war, da ich vorher noch nicht viel von dieser Art von Einrichtung gemacht habe.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage