동일한 jRuby 프로세스의 ActiveRecord 백엔드와 다른 스레드에서 작업 스케줄링 (rufus_scheduler) 및 처리 (delayed_job, DJ) 작업을 실행하려고합니다.Threaded DelayedJob 작업자가 ActiveRecord 연결 풀을 말끔히 처리합니다.
한 DJ 노동자가 사용 중일 때 잘 작동하지만 내가 (큐 당 하나의 작업자와) 여러 대기열을 설정할 때, 스케줄러는 다음과 같은 메시지와 함께 종료 :
rufus-scheduler intercepted an error:
job:
Rufus::Scheduler::CronJob "*/10 * * * * *" {}
error:
ActiveRecord::ConnectionTimeoutError
could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use
이 날에 리드 작업 종료시 데이터베이스 연결을 해제하지 않는 것으로 생각되지만 아직 관련 코드를 찾지 못했습니다. 풀의 연결 수는 50으로 구성됩니다.
스크립트는 SIGTERM
을 수신 할 때까지 계속 실행 중이며 Rails 환경에 액세스해야합니다. MWE는 다음과 같습니다.
require './config/environment'
module Jobs
class ExampleJob < ActiveJob::Base
queue_as :system
def perform
puts 'Performing ExampleJob'
end
end
end
QUEUES = %i(system database).freeze
NUM_QUEUES = QUEUES.size
workers = []
worker_threads = []
NUM_QUEUES.times do |queue_number|
worker = Delayed::Worker.new(quiet: false)
worker.name = queue_number
workers.append(worker)
worker_threads.append(Thread.new do
worker.start
end)
end
scheduler = Rufus::Scheduler.new
scheduler.cron '*/10 * * * * *' do
puts 'Scheduled ExampleJob'
Jobs::ExampleJob.perform_later
end
Signal.trap('TERM') do
scheduler.shutdown
workers.each do |worker|
worker.stop
end
end
scheduler.join
worker_threads.each do |thread|
thread.join
end
올바르게 실행하려면 방법이 있습니까?
여러 가지 문제가있는 것 같습니다 (https://ylan.segal-family.com/blog/2013/09/11/delayedjob-workers-are-not-thread-safe/). 스레드 DelayedJob 노동자. – chickenburgers