【发布时间】:2017-04-03 09:41:33
【问题描述】:
我现在遇到了一个问题,我很乐意接受人们可能提出的任何想法。
问题:在 Sneakers worker 中运行时,网络调用非常慢(Redis、HTTP)。例如,在 redis 中设置一个键大约需要 20 秒,而 HTTP get 调用大约需要 38 秒。从 rails c 开始,相同的 redis 调用需要
设置:我会尽量简洁。
- 一切都在 Docker 中运行(Rails + worker、Redis、Postgres 等)
- Rails 4.2.7 是主要的网络应用,使用 puma 作为网络服务器
- 有两个后台作业通过 Sneakers 处理并通过 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 和一些人一起在运动鞋上。任何想法都非常感谢!
【问题讨论】:
标签: ruby-on-rails ruby rabbitmq