私は今、問題を抱えており、皆さんの考え方に非常に満足しています。Railsのネットワークコールはスニーカーの作業員から極端に遅い
問題:Sneakersワーカーで実行しているときにネットワークコールが非常に遅い(Redis、HTTP)。たとえば、キーを赤く設定すると約20秒かかり、HTTPは約38秒かかります。 rails c
から同じredis呼び出しには、1秒間に<、HTTP呼び出しには約1秒かかります。
セットアップ:私はここで簡潔にしようとします。
- すべては(Railsの+労働者、Redisの、Postgresの等。)
- のRails 4.2.7ドッカーで実行されている2つの背景があり、Webサーバ
- などとしてピューマを使用して、メインのWebアプリですスニーカーを介して処理され、RabbitMQメッセージを介してトリガーされるジョブ。これらの「ワーカー」には、ActiveRecordから継承した、実際のアクティビティを行うクラスへの呼び出しが含まれます(つまり、HTTP呼び出しを行うか、Redisと対話します)。
- 私はWorkerクラス内でHTTP呼び出しを行い、 。また、デバッグのためにフォアグラウンドに移動しました。
Pumaは「シングル」モード(ワーカーなし、1スレッド)で実行するように設定されています。ここに私の現在のスニーカーの構成は次のとおりです。
# config/initializers/02_sneakers.rb
Sneakers.configure daemonize: false,
amqp: "amqp://rabbitmq",
# log: "log/sneakers.log",
log: STDOUT,
pid_path: "tmp/pids/sneakers.pid",
threads: 2,
workers: 1,
durable: true,
vhost: '/',
exchange: 'exchange',
exchange_type: 'direct'
Sneakers.logger.level = Logger::DEBUG
そして、私の労働者:
class StepWorker
include Sneakers::Worker
from_queue "queue", env: nil, timeout_job_after: 5.minutes, durable: true, ack: true
def work(raw_event)
logger.info { 'StepWorker received params: ' + raw_event }
message = JSON.parse(raw_event)
response = ""
time = Benchmark.measure {
response = RestClient.get('http://store/', { accept: :json })
}
logger.info { "response: #{response.length} in #{time.real}" }
ack!
end
end
私もスニーカーに一部の人々と一緒に行くissueを持っています。どんなアイデアでも大歓迎です!
別の情報を追加するだけです。 'development.rb'で次のように変更して、私のパフォーマンスの問題を解決しました:' config.assets.debug = false' – krsyoung