部署
commit信息:Updated Deployment (markdown) | 提交者:mperham | 提交时间:2020-05-20 | 版本:47cff67
概览
为了安全关闭Sidekiq,你需要对你的部署程序尽可能早的发送TSTP信号,同时尽可能晚的发送TERM信号。TSTP让Sidekiq停止获取新任务并且完成所有的当前工作。TERM让Sidekiq在N秒内退出,N被-t
时间超时选项设置,默认是25。在你的部署程序中使用TSTP和TERM是为了给作业留有最大的时间,以使作业在Sidekiq退出之前完成。
在超时发生时还在执行的作业,为了之后能重新执行,Sidekiq会把它们推送回Redis。
网络结构
我推荐在你的每一个产品集群应用服务程序中运行一个或者多个Sidekiq。在以前雇主那里,我在三个应用服务器上运行了两个Sidekiq进程,总共运行了六个目标进程。在默认并发性为25的情况下,这给了我们150个工作线程。所有6个进程都与同一个Redis主服务器通信,我们使用高
、默认
和低
队列来保持队列管理以便有尽可能简单的作业优先级。
为Sidekiq运行单独的计算机或使用许多不同的队列会增加我们的不需要的复杂性。
Heroku
将Sidekiq与Heroku一起使用很简单,为了启动一个sidekiq worker进程要向你的Rails 应用中添加一个Procfile
:
web: bundle exec puma ...
worker: bundle exec sidekiq -t 25 ...
为了连接你的Redis扩展,你需要通过设置REDIS_PROVIDER到某个环境变量来告诉Sidekiq使用哪一个环境变量,例如:heroku config:set REDIS_PROVIDER=REDISTOGO_URL
。当有其他目的时,请确保你使用不同的Redis实例,像是Rails 缓存。
记着Heroku有着30秒的程序重启硬限制,-t 25
告诉Sidekiq在启动“强制关闭”步骤之前给作业25秒的时间来完成作业。你无法发送TSTP信号,但可以选择在预部署钩中使用Sidekiq::ProcessSet.new.each(&:quiet!)
,以使你的作业有更多时间来完成。在25秒限制之后,Sidekiq将把任何没有完成的作业推送回Redis;为了你的作业能在程序运行备份时重启,请确保它是幂等的。
查看 该页面 来了解更多关于 Procfiles, Foreman 和 Heroku的细节。
设置这个环境变量将极大减少Sidekiq的内存使用,这被高度推荐:
heroku config:set MALLOC_ARENA_MAX=2
运行你自己的程序
如果你想在你的服务器中运行Sidekiq, 请使用systemd将Sidekiq作为系统服务启动.这样可以保证当Sidekiq 崩溃时该程序可以被重启。
下面是一个示例systemd unit文件。systemd文档有一些关于the .service file和 executing processes的章节。那些使用Linux的每个开发者都应该多次阅读这些章节。
systemctl stop sidekiq
systemctl start sidekiq
systemctl restart sidekiq
systemctl kill -s TSTP sidekiq # quiet
Sidekiq商业版的sidekiqswarm 二进制文件让使用单个systemd服务启动N个Sidekiq进程变得轻而易举。为了在开发环境和产品环境中自动化你的应用,请看Foreman这个实用工具。
Capistrano
使用capistrano-sidekiq
gem(github)。该集成支持已经被移除。警告:Capistrano默认使用daemonization,因此如果Sidekiq进程崩溃,它将不会自动重启。
事件
Sidekiq在启动时和关闭时会触发程序周期事件:
Sidekiq.configure_server do |config|
# runs after your app has finished initializing but before any jobs are dispatched.
config.on(:startup) do
make_some_singleton
end
config.on(:quiet) do
puts "Got TSTP, stopping further job processing..."
end
config.on(:shutdown) do
puts "Got TERM, shutting down process..."
stop_the_world
end
end
如果你想要‘开启/关闭’你的‘线程/执行者’或者‘信号’, 这非常的实用。
Sidekiq Pro可以使用:quiet
来通知长作业给即将到来的重启做准备(前提是super_fetch已经开启)。
# config/initializers/sidekiq.rb
$shutdown_pending = false
Sidekiq.configure_server do |config|
config.on(:quiet) do
$shutdown_pending = true
end
end
# some_job.rb
def perform
# This job might process 1000s of items and take an hour.
# Have each iteration check for shutdown. big_list_of_items
# should only return unprocessed items so the loop will continue
# where it left off.
big_list_of_items.find_each do |item|
process(item)
# Sidekiq Pro will restart job immediately on process restart
raise Sidekiq::Shutdown if $shutdown_pending
end
end