12

(Henley Chiuの回答の結果である私の詳細な設定については、以下を参照してください)。

Sidekiq の展開について頭を悩ませようとしてきましたが、実際には理解できません。同じサーバー上に、ステージング環境と運用環境を備えたアプリがあります。sidekiq deploy について私が目にするものはすべて、基本的に「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

ログ ファイルと pid は適切な場所にあるように見えますが、キューはマージされているだけです。どんな助けでも素晴らしいでしょう!

また、重要な場合:

Rails 3.2.11, passenger, nginx, rvm, Ubuntu 12.10, and Ruby 1.9.3

詳細な構成 (回答):

最初に、ポート 7777 (またはデフォルトの 6379 以外の任意のポート) で新しい redis サーバーをセットアップします。私が最初に使用したredis クイックスタート ガイドにほぼ従っています。

次に、初期化ファイルを作成しました。これには、クライアント構成とサーバー構成の両方があります。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 のトラブルシューティング ページでは、ユニコーンまたはパッセンジャーを使用する場合のセットアップの変更を推奨しているため、クライアント セットアップ用のコードをそこに追加しました。

# 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 は適切なポートを使用してデプロイ時に起動しますが、実際には何も処理しません。しかし、ウィキは名前空間の使用を推奨しているため、初期化ファイルに追加するだけになりました。

以前にこの種のセットアップをあまり行ったことがなかったので、これを理解するのが本当に難しかったので、これが他の人に役立つことを願っています.

4

3 に答える 3

4

initializers/sidekiq.rb ファイルで、すべての環境が起動する Redis キューを指定します。私の場合は次のとおりです。

redisServer = "localhost"
Sidekiq.configure_server do |config|
  config.redis = { :url => 'redis://' + redisServer + ':6379/0' }
end

各環境を個別のキューから処理する場合は、各環境の環境フォルダーに特定の sidekiq.rb ファイルを配置できます。それぞれ異なる redis サーバーを使用します。

于 2013-02-12T17:10:57.240 に答える
3

名前空間に加えて、Redis の Rails 環境ごとに DB を分離することも良いでしょう:

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
于 2014-07-08T10:34:08.910 に答える