CRON Работа в контейнере - PullRequest
       40

CRON Работа в контейнере

1 голос
/ 25 февраля 2020

У меня есть сервер, который я написал, который позволяет нам «начинать» обработку и / или управлять заданиями CRON для выполнения обработки по разным графикам.

Если я запускаю свой контейнер горизонтально масштабируемым образом, как ли я восстановиться после аварийных контейнеров или сообщить новым контейнерам, что задание CRON обрабатывается другим контейнером?

Должен ли я хранить определения заданий cron и их состояние в базе данных? Если да, то как мне записать состояние, если контейнер выходит из строя и не имеет возможности записать состояние в БД?

Должен ли я разбить определение моего контейнера на отдельный контейнер и запускать только один?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

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

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

К счастью, вы уже используете распределенный планировщик заданий, Kubernetes! Вы можете воспользоваться функцией Kubernetes CronJob . Если вы настроите свое приложение так, чтобы оно могло взаимодействовать с API Kubernetes , ваше приложение может создавать объекты CronJob, а остальное оставлять для планировщика.

1 голос
/ 25 февраля 2020

Почему вы думаете, что вам нужно делать что-то другое только потому, что вы виртуализировали свои серверы?

Планирование возможно в /etc/cron.d и состояние выполнения через pid-файлы в /run/. Просто поделитесь этим каталогом с контейнерами, которые в нем нуждаются. Механизмы должны основываться на транзакциях, если несколько действий зависят друг от друга, как обычный cronjob.

Более важно то, как вы организуете контейнеры.

Я бы получил cronjob-et c контейнер, который запускает новый контейнер для каждой работы в нужное время. Вам не нужны контейнеры, работающие, когда их работа неактивна.

Если у вас менее 1000 заданий, будет достаточно сохранить дополнительную информацию о контейнере планирования / запуска в файле sqlite3.

...