簡體   English   中英

使Rails,Heroku,Unicorn,Sidekiq和Hirefire都玩起來不錯

[英]Making Rails, Heroku, Unicorn, Sidekiq and Hirefire all play nice

我們在Heroku上有一個非常復雜的Rails設置。

在典型的一天中,我們有大約10個Web dynos與Unicorn(每個2x並運行3個Unicorn工人)和15個Dynos運行“延遲作業”,盡管它波動,所以當可以節省成本時,我們使用hirefire來擴大和縮小規模。 我們的Postgres數據庫允許400個連接。

上周,我終於對我們已經使用了幾年的Delayed :: Jobs隊列感到厭煩。 我們有一系列的作業每10分鍾運行一次,直到運行所有作業都花費超過10分鍾的時間,這樣他們的隊列才會得到備份。 我決定做出移居到Sidekiq的決定,因為我過去在此方面取得了一些成功。

到目前為止,它的運行情況還不錯,盡管我發現我們的網絡測功機不太穩定。 例如,這是昨天昨天3小時的新遺物圖:

新newrelic圖

但是,這恰好是前一周的相同時間段:

舊的新文物圖

基本上,在Sidekiq之前,我們的工作似乎根本沒有影響到我們的網絡測功機,但現在它們已經開始了。 我唯一的猜測是,每運行10分鍾,它們就會暫時壓倒我們的postgres連接,這會減慢網絡測功的速度。 這是我可以想象工作會影響網絡的唯一方法。

是否有關於如何將它們分開的想法,或者它們相互之間的影響較小,以及我們的Web響應時間更一致?

這是我們的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 worker實例覆蓋數據庫上的池設置,以便我們可以充分利用並發性。

還有我們的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

我們的聘用經理的設置如下

網頁:

在此處輸入圖片說明

工作人員:

在此處輸入圖片說明

有什么建議么?

尚待觀察,但一個非常有前途的修復程序似乎已在我的config/database.yml為sidekiq工作者關閉了prepare_statements:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM