Sidekiq развертывается в нескольких средах
(см. ниже мою подробную конфигурацию, которая является результатом ответа Хенли Чиу).
Я пытался обернуть свой мозг вокруг развертываний Sidekiq, и я действительно не получаю его. У меня есть приложение с промежуточной средой и производственной средой на одном сервере. Все, что я вижу о развертывании sidekiq, в основном говорит: "просто добавьте sidekiq/capistrano в файл развертывания", поэтому я это сделал. И тогда инструкции "вот файл yml с параметрами", но ничего не кажется объяснимый. Нужны ли мне пространства имен? Я вижу это в файле инициализации, но это, похоже, указывает за пределы сервера.
я развернул ранее, и каждый этап, похоже, загружает sidekiq с надлежащей средой, но они оба обрабатываются из одних и тех же очередей. Мои электронные письма с производства пытались быть обработаны на сцене sidekiq, и не удалось. Я остановил свою сцену на данный момент, но в конечном итоге мне нужно будет использовать ее снова. Я надеюсь, что я не тупой, я действительно пытался понять это и мне просто трудно найти окончательное "вот как это делается".
для чего это стоит, вот config / sidekiq.yml (который загружается нормально во время развертывания):
: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
файлы журналов и pids, похоже, находятся в нужном месте, но очереди просто объединены. Любая помощь будет отличной!
кроме того, если это имеет значение:
Rails 3.2.11, passenger, nginx, rvm, Ubuntu 12.10, and Ruby 1.9.3
детальная настройка (ответ):
сначала я настроил новый сервер redis на порту 7777 (или что-то еще порт, пожалуйста, Кроме по умолчанию 6379). В значительной степени следовал redis краткое руководство что я использовал в первый раз.
затем я сделал файл initilizer; это клиент и сервер конфиг. Оба необходимы, что делают sidekiq работу многошаговой.
обратите внимание, что я использую внешний файл YAML для настройки. Я использую SettingsLogic для этого, чтобы сделать вещи проще, но вы можете так же легко этого сами включив файл. Используя файл yaml, нам не нужно касаться наших сред / промежуточных или производственных файлов.
# 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
я использую пассажир -страница устранения неполадок sidekiq wiki рекомендует изменить настройку при использовании unicorn или passenger, поэтому я добавил код для настройки клиента:
# 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
Это мой файл настроек (очевидно, значения изменены):
#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'
я обнаружил, что добавление пространства имен в config / sidekiq.файл yml, похоже, не работал - sidekiq загружался при развертывании с использованием правильного порта, но на самом деле ничего не обрабатывал. Но поскольку wiki рекомендует использовать пространство имен, я просто добавил его в init-файл.
Я надеюсь, что это полезно для других, потому что это было очень трудно для меня понять, не сделав много такого рода установки раньше.
3 ответов
в ваших инициализаторах / sidekiq.RB-файл, вы указываете очередь Redis, с которой загружаются все среды. Для меня это:
redisServer = "localhost"
Sidekiq.configure_server do |config|
config.redis = { :url => 'redis://' + redisServer + ':6379/0' }
end
Если вы хотите, чтобы каждая среда обрабатывалась из отдельных очередей, у вас может быть определенный sidekiq.файлы rb в папке среды для каждой среды. Каждый с разными серверами redis.
если все среды(разработка, постановка и производство) находятся на одном сервере, используйте пространство имен. В инициализаторы/sidekiq.файл РБ,
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
end
в дополнение к пространству имен будет хорошо, если вы также отделите DBs для каждой среды Rails в Redis, т. е.:
env_num = Rails.env == 'staging' ? 0 : 1
Redis.new(db: env_num) # existing DB is selected if already present
Sidekiq.configure_server do |config|
config.redis = { url: "redis://localhost:6379/#{env_num}", namespace: "app_name_#{Rails.env}" }
end
Sidekiq.configure_client do |config|
config.redis = { url: "redis://localhost:6379/#{env_num}", namespace: "app_name_#{Rails.env}" }
end