Rails, ActiveJobs и AWS SQS: что происходит с моей работой, когда рабочий экземпляр убит? - PullRequest
0 голосов
/ 05 декабря 2018

Мы используем Rails 5.0.2 и ActiveJobs в AWS Beanstalk с 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

Мы столкнулись с тем, что при уничтожении одного экземпляра в рабочей среде (из-за автоматического масштабирования или чего-то еще) 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 Ответ

0 голосов
/ 05 декабря 2018

Улавливая сигнал SIGTERM, вы можете выполнить любую очистку, которую захотите, до завершения процесса (ваша среда может отправить SIGKILL позже, который не может быть перехвачен).

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