Если бы у вас была задача, которую вы хотели бы выполнить только один раз на кластере серверов, через регулярные промежутки времени, что было бы лучшим способом достижения этого? В данном случае определение кластера - это два или более идентичных сервера с распределенными сеансами, расположенными за балансировщиком нагрузки.
Вариант использования: у вас есть задача, которая стоит дорого, и которую нужно запускать только один раз в X часов. Эта работа может, например, перебирать кучу записей и обновлять их статус.
- В худшем случае, если задание будет выполнено дважды, ваши данные будут недействительными.
- В лучшем случае сценарий использует ресурсы на всех ваших серверах.
Сводка требований:
- Задание все равно должно выполняться, даже если один из узлов не работает.
- Задание должно выполняться только один раз в соответствии с расписанием.
- Если несколько заданий запланировано одновременно или в одно и то же время, количество запущенных заданий распределяется поровну между серверами.
- Машины должны иметь одинаковую кодовую базу и синхронизироваться через NTP.
- Конфигурация может отличаться между узлами и узлами в зависимости от переменных среды.
- Задание должно начинаться вовремя или в течение заданного интервала назначенного времени. (скажем 5 минут например)
Возможные решения
- Установите один узел как главный узел, это не работает, поскольку это нарушает 1 выше.
- Сделайте запрос на балансировку нагрузки, чтобы начать работу. К сожалению, это имеет побочный эффект: если у вас одновременно запущено несколько заданий, все они могут выполняться на одной машине.
Это должно было бы работать на Java, в контейнере сервлета. Однако это не кодирование работы, которую я ищу.
Конечно, это решенная проблема с известным лучшим решением.
Смежный вопрос. /programming/5949038/schedule-job-executes-twice-on-cluster
Это не дубликат, поскольку решение является недостаточным в соответствии с этими 5 требованиями, приведенными выше. Решение с наибольшим количеством голосов страдает от проблемы гонки, а второе решение нарушает требование 3