【问题标题】:Threaded DelayedJob workers dry up ActiveRecord connection pool线程化的 DelayedJob 工作人员干掉了 ActiveRecord 连接池
【发布时间】:2017-11-18 06:01:19
【问题描述】:

我想使用 ActiveRecord 后端从同一个 jRuby 进程但在不同的线程中运行作业调度(使用 rufus_scheduler)和处理(使用 delayed_job,DJ)。

当只有一个 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

有没有办法让它正常运行?

【问题讨论】:

标签: ruby multithreading activerecord delayed-job rufus-scheduler


【解决方案1】:

怎么样

module Jobs
  class ExampleJob < ActiveJob::Base
    queue_as :system

    def perform
      puts 'Performing ExampleJob'
    end

    after_perform do
      ActiveRecord::Base.clear_active_connections!
    end
  end
end

?

【讨论】:

  • 感谢您的建议,很遗憾这并不能解决问题。
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2014-05-31
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多