Решение PCF для ограничения выполнения весеннего задания @Scheduled только в одном экземпляре в облачной среде

У меня есть весеннее задание @Scheduled в Pivotal Cloud Foundry (PCF), которое может выполняться в нескольких экземплярах, но я хочу ограничить его запуск только в одном экземпляре в облачной среде PCF.

Предоставляет ли PCF какое-либо готовое решение для этого или нам нужно внести изменения в наш код?

Любое предложение будет полезно для меня в реализации.


person Avinash Jethy    schedule 11.12.2019    source источник
comment
Для этого вам придется использовать приличный планировщик, например Quartz. Или реализовать что-то самостоятельно, предлагаю воспользоваться проверенным решением.   -  person M. Deinum    schedule 11.12.2019
comment
@ M.Deinum Я нашел решение с помощью spring -shedlock- baeldung.com/shedlock-spring . Но не уверен, что это хорошее решение или нет. Пожалуйста, дайте мне знать о нем. Спасибо.   -  person Avinash Jethy    schedule 11.12.2019
comment
Это самоуверенный вопрос, на который я не буду здесь отвечать :). Если это сработает, используйте это.   -  person M. Deinum    schedule 11.12.2019


Ответы (2)


Один из способов сделать это - посмотреть на переменную окружения INSTANCE_INDEX или CF_INSTANCE_INDEX (это одно и то же). Это будет номер экземпляра вашего приложения. Он основан на нуле, поэтому он будет равен 0 к количеству имеющихся у вас экземпляров приложения минус один (например, 5 AI == 0-4).

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

Что касается способов, которыми вы могли бы это сделать:

  • Ваше запланированное задание может проверить переменную env, а если не нулевой индекс, то оно просто завершится успешно.
  • Вы можете отключить планирование, если не работаете с нулевым индексом.
  • Вы можете обернуть свою конфигурацию расписания в профиль Spring и включить этот профиль только в нулевом индексе.
  • Вы можете использовать @Conditional и создать собственный org.springframework.context.annotation.Condition, который проверяет индекс переменной env.

Я уверен, что есть и другие варианты. Это только те, которые у меня в голове.

Надеюсь, это поможет!

person Daniel Mikusa    schedule 12.12.2019
comment
есть ли способ убедиться, что вызов отдыха всегда будет переходить к конкретному экземпляру, например: CF_INSTANCE_INDEX = 0? - person Avinash Jethy; 23.07.2020
comment
Да, но это совсем другой вопрос. См. github.com/cloudfoundry/gorouter#headers и X-CF-APP-INSTANCE. - person Daniel Mikusa; 23.07.2020

У меня есть два решения для этого: 1) набор экземпляров: 1 в manifest.yml, чтобы наше приложение запускалось только в одном экземпляре в облачном хранилище. 2) используйте cf run-task, чтобы он создал только один контейнер, запустите ваше приложение, а затем уничтожьте приложение после завершения.

Пожалуйста, поделитесь своим мнением по этому поводу. Спасибо

person Avinash Jethy    schedule 06.02.2020