Как запускать cron каждые 2 минуты, но начинать с 5-й минуты определенного c часа? - PullRequest
1 голос
/ 20 марта 2020

В основном мой cron обновляет базу данных каждые 2 минуты. Но мне нужно запустить другой cron, который обновляет базу данных каждые 24 часа. Мне нужно убедиться, что нет условий гонки, пока работает второй крон (в день), то есть оба крона не могут бегать вместе и перекрываться. Это необходимо реализовать в кластере Kubernetes с помощью заданий.
Мое решение - запускать первый крон каждые 2 минуты, но задерживать на 5 минут при запуске второго крона (в день).
Любое альтернативное решение приветствуется.

1 Ответ

0 голосов
/ 20 марта 2020

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

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

Если вы действительно не можете придумать какое-либо решение для решения этой проблемы в своем коде, в Kubernetes есть механизм, который запрещает запуск новой работы из того же задания. Вы можете установить флаг spe c .concurrencyPolicy: Запретить , поэтому, если запуск вашей работы занимает более 2 минут, новая работа будет пропущена. Это не глобальный флаг, это только за cronjob.

Вы можете объединить эту возможность с spe c .initContainers и найти способ запустить обе задачи в одном и том же задании.

spe c .initContainers - это специализированные контейнеры, которые запускаются перед контейнерами приложения.

Вот пример:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  concurrencyPolicy: Forbid
  schedule: "*/2 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          initContainers
          - name: hello1
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          containers:
          - name: hello2
            image: busybox
            args:
            - /bin/sh
            - -c
            - DATE=`date +"%H:%M"`; if [[ $DATE == "00:00" ]]; then date; echo Hello from the Kubernetes cluster; fi
          restartPolicy: OnFailure

Этот манифест определяет cronJob, который будет запускаться каждые 2 минуты и запускать initContainer (ваше 2-минутное задание), а также будет запускать второй контейнер каждые 2 минуты Дело в том, что во втором контейнере у нас есть сценарий оболочки, проверяющий, наступила ли полночь (игнорируемые секунды, поскольку мы не можем быть уверены, когда он начнется).

Возможно, вам придется настроить эту часть кода:

DATE=`date +"%H:%M"; if [[ $DATE == "00:00" ]

Предположим, что выполнение вашего первого контейнера занимает больше минуты, это будет 00:01, а ваша вторая работа никогда не будет казнен.

Дайте мне знать, помогла ли вам эта информация и решение.

...