代码之家  ›  专栏  ›  技术社区  ›  Premanandh Selvakumarasamy

使用Cloud66和DigitalOcean的Rails部署时不会影响当前运行的sidekiq进程

  •  1
  • Premanandh Selvakumarasamy  · 技术社区  · 7 年前

    我已经用Ruby(2.4.1)创建了Rails(版本5)应用程序。我正在使用DigitalOcean实例和Cloud66进行部署过程。我正在使用Sidekiq进行后台处理。我的每次部署都会杀死一些来自sidekiq的长时间运行的进程,并且不会重试。sidekiq中的每个任务都更重要,所以我希望在不影响这些工作的情况下进行部署。是否有任何方法可以在不影响sidekiq中当前正在运行的流程的情况下进行部署?

    提前谢谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   nattfodd    7 年前

    Sidekiq支持优雅的关机,这意味着它给正在运行的作业一些时间来完成。默认情况下,我认为这大约是30秒。

    您可以在中调整等待时间 config/sidekiq.yml :

    :timeout: 120
    

    更多信息: https://github.com/mperham/sidekiq/wiki/Signals

        2
  •  1
  •   Premanandh Selvakumarasamy    3 年前

    最终我找到了解决办法。

    我已经使用预部署挂钩在开始部署之前发送TSTP,然后发送TERM以正常关闭sidekiq进程。所以,在开始部署之前,所有sidekiq进程都将被优雅地终止,这些作业将使用最新部署创建的sidekiq进程执行。

    TSTP -这将停止从redis接收即将到来的任务。

    用法:例如) kill -TSTP <sidekiq-processid>

    <> 期限 -这将在中提到的时间内终止进程 -t timeout_value 选项,假设运行的作业未完成,则sidekiq进程将终止,作业将再次推入队列,并使用相同的参数再次执行作业。

    注意:如果从一开始就再次执行同一任务没有问题,请使用此方法。