私たちはHerokuでかなり複雑なRails設定をしています。Rails、Heroku、Unicorn、Sidekiq、Hirefireをすべて素敵に演奏する
一般的な日には、Unicorn(各2x、3ユニコーンの従業員)と15人の従業員のDynosが遅延ジョブを実行する約10のWeb Dynosを持っていますが、変動しますので、hirefireを使用してコストを節約する。私たちのPostgresデータベースは400の接続を可能にします。
先週、私はついに私たちが数年間使っていたDelayed :: Jobsのキューにうんざりしました。私たちは10分ごとに実行されていた一連のジョブを持っています。すべてのジョブを実行するのに10分以上かかるので、キューにバックアップされます。私は過去にいくつかの成功を収めていたので、Sidekiqへの移行を決定しました。
これまでのところうまくいきましたが、私たちのウェブダイノスが一貫性を失うことがわかりました。 、基本的に
:
しかし、ここでは正確に同じ時間帯の前の週のように見えたものです。たとえば、ここでは3時間、昨日の私達の新しい遺物グラフでありますサイドキックの前に、私たちの仕事は私たちのウェブダイノスに全く影響を与えていないようですが、今はそうです。私の唯一の推測は、私たちの10分ごとのジョブが実行されると、一時的に私たちのポストグル接続を圧倒して、Web dynosを遅くしているということです。仕事がウェブに影響すると私が想像できる唯一の方法です。
これらを少しずつ別々にしておくか、お互いに影響を及ぼしていないか、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ワーカーインスタンスのDBにプールの設定を上書きしています並行性
そして、我々のdatabase.ymlの
production:
database: myapp_production
adapter: postgresql
encoding: unicode
pool: 5
そして、我々の
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
unicorn.rbそして、私たちのProcfile:私たちのhirefireマネージャーが
ように設定されている
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq -e production -C config/sidekiq.yml
Web:
労働者:
任意の提案ですか?