代码之家  ›  专栏  ›  技术社区  ›  fguillen

Rails、ActiveJobs和AWS SQS:当一个worker实例被终止时,我的作业会发生什么?

  •  11
  • fguillen  · 技术社区  · 6 年前

    我们在AWS Beanstalk中使用Rails 5.0.2和ActiveJobs作为gem的后端 active_elastic_job .

    我们的工作定义如下:

    class MyJob < ActiveJob::Base
      rescue_from(StandardError) do |exception|
        self.class.set(:wait => 1.minutes).perform_later
      end
    
      def perform
        MyLongTask.run
      end
    end
    

    当工作环境中的一个实例被终止(由于自动伸缩或其他原因)时 rescue_from 不会执行,作业也不会发送回队列。

    我们如何捕捉实例被调用被终止的那一刻,以便在我的进程真正被终止之前能够优雅地做出反应和结束?(如果可能)

    更新

    我在试这个

    class MyJob < ActiveJob::Base
      def perform
        begin
          sleep(100)
        rescue SignalException => e
          # send signal to some log place
          raise e
        end
      end
    end
    

    但我从来没有发过日志 终止 当我用 $ restart puma

    1 回复  |  直到 6 年前
        1
  •  1
  •   Umang Raghuvanshi    6 年前

    通过抓住 SIGTERM 信号,您可以在进程终止之前执行所需的任何清理(您的环境可能会发送 SIGKILL 以后就不会被抓到了)。

    Signal.trap(:SIGTERM) {
      # perform cleanup here
      exit
    }