【问题标题】:Rails with Cloud66 and DigitalOcean deploy without affecting currently running sidekiq process使用 Cloud66 和 DigitalOcean 部署 Rails,而不影响当前正在运行的 sidekiq 进程
【发布时间】:2018-05-29 14:23:33
【问题描述】:
我已经用 Ruby(2.4.1) 创建了 Rails(版本 5) 应用程序。我正在使用 DigitalOcean 实例和 Cloud66 进行部署过程。我正在使用 Sidekiq 进行后台处理。我的每次部署都会从 sidekiq 杀死一些长时间运行的进程,并且不会重试。 sidekiq 中的每个任务都比较重要,所以我想在不影响这些工作的情况下进行部署。有什么方法可以在不影响sidekiq当前运行进程的情况下进行部署?
提前致谢。
【问题讨论】:
标签:
ruby-on-rails
deployment
sidekiq
【解决方案1】:
最终我找到了解决方案。
我使用预部署挂钩在开始部署之前发送 TSTP,然后发送 TERM 以正常关闭 sidekiq 进程。因此,在开始部署之前,所有 sidekiq 进程将被优雅地终止,这些作业将使用最新部署创建的 sidekiq 进程执行。
TSTP - 这将停止从 redis 获取即将执行的任务。
用法:例如)kill -TSTP <sidekiq-processid>
TERM - 这将在-t timeout_value 选项中提到的时间内终止进程,假设正在运行的作业未完成,则 sidekiq 进程将被终止并再次将作业推送到队列和作业将使用相同的参数再次执行。
注意:当从头再次执行相同的任务没有问题时使用此方法。