Процесс часов 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
Таким образом, когда у нас случаются несвоевременные перезапуски после развертывания, мы, по крайней мере, знаем, что запланированная работа на самом деле не выполнялась.
Было бы интересно узнать, есть ли у кого-то более полное и простое решение!