Процесс часов Heroku: как обеспечить, чтобы рабочие места не были пропущены?

Я создаю приложение Heroku, которое опирается на запланированные работы. Ранее мы использовали Heroku Scheduler, но тактовые процессы кажутся более гибкими и надежными. Итак, теперь мы используем процесс синхронизации, чтобы ставить фоновые задания в определенное время / интервалы.

В документах Heroku упоминается, что динамометрические часы, как и все динамометры, перезапускаются не реже одного раза в день, и это влечет за собой риск того, что процесс синхронизации пропустит запланированное задание: "Поскольку динамограммы перезапускаются не реже одного раза в день, потребуется некоторая логика существует при запуске процесса синхронизации, чтобы гарантировать, что интервал задания не был пропущен во время перезапуска dyno." (См. https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)

Каковы некоторые рекомендуемые способы гарантировать, что запланированные задания не пропущены, и повторно ставить в очередь все пропущенные задания?

Одним из возможных способов является создание записи базы данных всякий раз, когда задание запускается / ставится в очередь, и проверять наличие ожидаемых записей через равные промежутки времени в задании часов. Самым большим недостатком этого является то, что если есть системная проблема с синхронизатором времени, которая приводит к его отключению в течение значительного периода времени, то я не могу выполнять опрос каждые X часов, чтобы убедиться, что запланированные задания были успешно выполнены, так как что опрос происходит в течение суток.

Как вы справились с проблемой устойчивости динамометра?

Спасибо!

2 ответа

Решение

Вам нужно будет где-то хранить данные о работе. На Heroku у вас нет никакой информации или гарантии о том, что ваш код выполняется только один раз и все время (из-за циклического повторения)

Вы можете использовать такой проект (но не очень): https://github.com/amitree/delayed_job_recurring

Или, в зависимости от ваших потребностей, вы можете создать планировщик или процесс, который планирует задания на следующие 24 часа и выполняется каждые 4 часа, чтобы быть уверенным, что ваши задания будут запланированы. И надеемся, что планировщик героку будет работать хотя бы раз в 24 часа. И иметь по крайней мере 2 рабочих, обрабатывающих работу.

Хотя это требует участия человека, у нас есть регистрация запланированных заданий с помощью Honeybadger через хук after_perform в рельсах.

      # frozen_string_literal: true

class ScheduledJob < ApplicationJob
  after_perform do |job|
    check_in(job)
  end

  private

  def check_in(job)
    token = Rails.application.config_for(:check_ins)[job.class.name.underscore]
    Honeybadger.check_in(token) if token.present?
  end
end

Таким образом, когда у нас случаются несвоевременные перезапуски после развертывания, мы, по крайней мере, знаем, что запланированная работа на самом деле не выполнялась.

Было бы интересно узнать, есть ли у кого-то более полное и простое решение!

Другие вопросы по тегам