Wdrażanie Sidekiq w wielu środowiskach

(Zobacz poniżej moją szczegółową konfigurację, która jest wynikiem odpowiedzi Henleya Chiu).

Próbowałem owijać mózg wokół wdrożeń Sidekiq i tak naprawdę tego nie rozumiem. Mam aplikację ze środowiskiem pomostowym i środowiskiem produkcyjnym na tym samym serwerze. Wszystko, co widzę o wdrożeniach sidekiq, w zasadzie mówi „po prostu dodaj sidekiq / capistrano do pliku instalacyjnego”, więc to zrobiłem. A potem instrukcje są „tutaj plik yml z opcjami”, ale nic nie wydaje się wyjaśnione. Czy potrzebuję przestrzeni nazw? Widzę to w pliku inicjującym, ale wydaje się, że wskazuje to na serwer.

Wdrożyłem wcześniej i każdy etap wydaje się uruchamiać sidekiq w odpowiednim środowisku, ale oba przetwarzają z tych samych kolejek. Moje e-maile z produkcji starały się być przetwarzane przez stagekiki i zawiodły. Na razie zatrzymałem scenę, ale w końcu będę musiał użyć jej ponownie. Mam nadzieję, że nie jestem gęsty, naprawdę starałem się to zrozumieć i mam trudności ze znalezieniem ostatecznego „oto jak to się robi”.

Na ile warto, tutaj jest config / sidekiq.yml (który jest ładowany podczas wdrażania):

: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

Pliki dziennika i pidy wydają się być we właściwym miejscu, ale kolejki są po prostu scalane. Każda pomoc byłaby WIELKA!

Ponadto, jeśli ma to znaczenie:

Rails 3.2.11, passenger, nginx, rvm, Ubuntu 12.10, and Ruby 1.9.3
Szczegółowa konfiguracja (odpowiedź):

Najpierw ustawiłem nowy serwer redis na porcie 7777 (lub jakikolwiek inny port poza domyślnym 6379). Dość dużo poszło zaPrzewodnik szybkiego startu redis że użyłem tego po raz pierwszy.

Potem zrobiłem plik inicjujący; ma to konfigurację klienta i serwera. Oba są niezbędne do wielostopniowego działania sidekiq.

Zauważ, że używam zewnętrznego pliku YAML dla ustawień. ja używamUstawieniaLogic aby to ułatwić, ale możesz równie łatwozrób to sam, włączając plik. Korzystając z pliku yaml, nie musimy dotykać naszych środowisk / plików tymczasowych ani produkcyjnych.

# 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

Używam pasażera -strona rozwiązywania problemów z wiki sidekiq zaleca zmianę ustawień podczas korzystania z jednorożca lub pasażera, więc dodałem kod do konfiguracji klienta:

# 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

To jest mój plik ustawień (oczywiście zmieniono wartości):

#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'

Odkryłem, że dodanie przestrzeni nazw do pliku config / sidekiq.yml nie działa - sidekiq uruchomiłby się przy wdrożeniu przy użyciu odpowiedniego portu, ale w rzeczywistości nic nie przetwarzał. Ale ponieważ wiki zaleca używanie przestrzeni nazw, po prostu dodałem ją do pliku init.

Mam nadzieję, że będzie to pomocne dla innych, ponieważ było to dla mnie naprawdę trudne do zrozumienia, ponieważ wcześniej nie wykonałem zbyt wielu takich konfiguracji.

questionAnswers(3)

yourAnswerToTheQuestion