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

fgu*_*len 11 ruby-on-rails amazon-sqs amazon-web-services amazon-elastic-beanstalk rails-activejob

我们使用Rails 5.0.2和ActiveJobs在AWS魔豆与SQS与宝石后端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
Run Code Online (Sandbox Code Playgroud)

我们经历过,当工作环境中的一个实例被杀死(由于自动缩放或某种原因)时,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
Run Code Online (Sandbox Code Playgroud)

但是,当我终止实例时,日志永远不会发送,因为我没有杀死美洲狮进程$ restart puma

Uma*_*shi 2

通过捕获SIGTERM信号,您可以在进程终止之前执行任何您想要的清理(您的环境可能会稍后发送SIGKILL无法捕获的信号)。

Signal.trap(:SIGTERM) {
  # perform cleanup here
  exit
}
Run Code Online (Sandbox Code Playgroud)