【问题标题】:Making Rails, Heroku, Unicorn, Sidekiq and Hirefire all play nice让 Rails、Heroku、Unicorn、Sidekiq 和 Hirefire 都运行良好
【发布时间】:2016-09-08 18:06:49
【问题描述】:

我们在 Heroku 上有一个相当复杂的 Rails 设置。

在典型的一天中,我们有大约 10 个 Web Dynos 和 Unicorn(每个 2x 并运行 3 个 Unicorn 工作人员)和 15 个工作人员 Dynos 运行延迟作业,尽管它会波动,所以我们使用hirefire 来扩大和缩小规模以节省成本。我们的 Postgres 数据库允许 400 个连接。

上周我终于厌倦了我们已经使用了几年的 Delayed::Jobs 队列;我们有一系列每 10 分钟运行一次的作业,它的运行时间超过了 10 分钟,因此它们的队列将得到备份。我决定决定搬到 Sidekiq,因为我过去在这方面取得了一些成功。

到目前为止,它运行良好,尽管我发现我们的网络测功机不太一致。例如,这是我们昨天 3 小时的新遗迹图:

但这就是前一周完全相同的时间段的样子:

基本上,在 Sidekiq 之前,我们的工作似乎根本没有影响我们的网络 dyno,但现在确实如此。我唯一的猜测是,当我们每 10 分钟运行一次作业时,它们会暂时压倒我们的 postgres 连接,这会减慢 Web dynos。这是我能想象到的工作会影响网络的唯一方式。

有什么想法可以让它们更加独立,或者减少它们对彼此的影响,让我们的网络响应时间更加一致?

这是我们的 sidekiq.yml:

---
:concurrency: 5
production:
  :concurrency: <%= ENV['WORKER_POOL'] || 15 %>
:queues:
  - [instant, 3]
  - [fetchers, 2]
  - [mailers, 1]
  - [fetch_all, 1]
  - [moderation, 1]
  - [default, 1]
  - [reports, 1]
  - [images, 1]
  - [slack, 1]

还有我们的 sidekiq.rb

require 'sidekiq'

Sidekiq.configure_server do |config|
  database_url = ENV['DATABASE_URL']
  if database_url
    pool = ENV['WORKER_POOL'] || 15
    new_database_url = "#{database_url}?pool=#{pool}"
    ActiveRecord::Base.establish_connection(new_database_url)
  end
end

Sidekiq.default_worker_options = { retry: 1 }

我们正在为 sidekiq 工作实例覆盖数据库上的池设置,以便我们可以充分利用并发性。

还有我们的 database.yml

production:
  database: myapp_production
  adapter: postgresql
  encoding: unicode
  pool: 5

还有我们的 unicorn.rb

worker_processes 3
timeout 30
preload_app true
listen ENV['PORT'], backlog: Integer(ENV['UNICORN_BACKLOG'] || 200)

before_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

还有我们的 Procfile:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq -e production -C config/sidekiq.yml

我们的招聘经理设置如下

网页:

工人:

有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails postgresql heroku sidekiq unicorn


    【解决方案1】:

    还有待观察,但一个非常有希望的解决方法似乎是在我的config/database.yml 中为 sidekiq 工作人员关闭了 prepare_statements:

    default: &default
      adapter: postgresql
      encoding: unicode
      pool: 5
      prepared_statements: <%= !Sidekiq.server? %>
    

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多