WedX - журнал о программировании и компьютерных науках

Как восстановить таймер Go после перезапуска веб-сервера (или обновления кода)?

Рассмотрим, например, веб-службу, где пользователь может сделать запрос API для запуска задачи в определенное запланированное время. Определение задачи и запланированное время сохраняются в базе данных. Первый подход, который я придумал, - запустить таймер Go и подождать, пока таймер истечет в горутине (не блокируя запрос). Эта горутина по истечении времени также запустит другой запрос API, чтобы начать выполнение задачи.

Теперь проблема возникает при повторном развертывании этой службы. Для развертывания без простоев я использую Einhorn с goji. После перезагрузки кода, очевидно, горутина-таймер и горутина-обработчик истечения срока действия таймера умирают. Есть ли способ восстановить таймер Go после перезагрузки кода?

Другая проблема, с которой я борюсь, - это позволить пользователю прервать таймер (после его запуска). У таймера перехода есть Stop, чтобы облегчить это. Но поскольку это API без сохранения состояния, когда запрос \interrupt поступает в службу, не имеет контекста канала таймера. И кажется, что невозможно маршалировать канал (возвращенный из NewTimer) на диск / db.

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

10.10.2014

  • Для этого я бы использовал службу внешней очереди задач, чтобы изолировать ее от самой службы. 10.10.2014

Ответы:


1

Один из наиболее часто используемых подходов - это планирование задачи вне вашего приложения, например, с помощью таймеров crontab или systemd.

Например, используя crontab:

# run every 30 minutes
*/30 * * * * /usr/bin/curl --head https://localhost/cron?key=something-to-verify-local-job >/dev/null 2>&1

Использование внешней очереди задач также является допустимым вариантом, как упомянуто @Not_a_Golfer, но более сложным.

10.10.2014
  • Но тогда все запланированные cronjobs (все еще ожидающие) исчезнут в случае сбоя оборудования или перезагрузки сервера. Чтобы избежать этого, мне нужно было бы создать своего рода реестр, в котором регистрировались бы все ожидающие выполнения cronjobs. 14.10.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]