Dokku在未完成任务的情况下移除worker



我有Ruby on Rails应用程序,在我用Dokku做任何部署之后,我有我的旧工作者正常运行任务,但是当我完成部署时,几秒钟后这个工作者被删除,并创建了一个新的工作者,而没有完成正在运行的所有任务。有人知道我是怎么解决的吗?或者工人在移除之前完成所有任务,或者在部署后创建工人时,来自旧工人的任务转到新工人?任何指示吗?

Dokku的零停机部署机制将在运行docker container stop之前等待一段可配置的时间。这将发送一个SIGTERM到您的应用程序,然后在宽限期后发送一个SIGKILL

您的应用程序代码应该处理SIGTERM并优雅地停止接受新工作,完成旧工作,然后终止。这通常是默认情况下后台处理框架所做的,但如果它是你编写的自定义框架,你可能需要在你的框架中配置它或添加功能。

我设法用一个变通方法来解决它,我创建了一个check_worker。我在预部署中调用的rb文件,它使工人沉默,以便不再执行任何任务,虽然有一个正在执行任务的工人,但它不会随着部署前进,直到它完成所有任务,只有在完成所有任务后才完成部署

app.json

{
"scripts": {
"dokku": {
"predeploy": "ruby check_worker.rb"
}
}
}

check_worker.rb

#!/usr/bin/env ruby
require 'sidekiq'
require 'sidekiq/api'
ps = Sidekiq::ProcessSet.new
ps.each(&:quiet!)
workers = true
while workers
works = []
active_workers = Sidekiq::Workers.new.map do |_process_id, _thread_id, work|
works = work
end
workers = works.length > 0
if workers
sleep 2
end
end

相关内容

最新更新