Как запустить ночное задание только в одном экземпляре, если оно развернуто в N экземплярах?

У меня есть Java-приложение, которое было запланировано запускать один раз каждую ночь в установленное время. Приложение отправляет электронные письма, если выполняется условие. Весь код планирования написан на Java, и я не использую какие-либо функции Amazon для его планирования. Это приложение было развернуто на экземпляре EC2 и находится за эластичным балансировщиком нагрузки. В зависимости от нагрузки могут быть добавлены дополнительные узлы. Мое java-приложение реплицируется и на другие узлы, и ночные задания выполняются во всех экземплярах.

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

Благодарю.

1 ответ

Я новее развернут в Amazon (и имею небольшой опыт работы со Spring), но я вижу несколько способов решить эту проблему:

  1. Просто используйте Apache Zookeeper. Создайте эфемерно-последовательные узлы в zookeeper для каждого узла. Когда у меня запланировано время, а узел находится первым в этой очереди - удалите узел из очереди, снова добавьте узел и запустите свою работу (Apache Curator Framework обладает всеми функциями, необходимыми для его реализации в коде).
  2. Используйте очереди Hazelcast (та же логика). Преимущества: hazelcast можно использовать во встроенном режиме. Минусы: не уверен в способностях обнаружения Hazelcast в Amazon, что касается моего опыта - Hazelcast гораздо менее стабилен, чем Zookeeper.
  3. Другой способ - если у вас есть "идентификатор экземпляра" в каждом экземпляре, вы можете запустить задание, если время начала достигнуто И instanceId.hashcode() % dayOfMonthNumber == 0
Другие вопросы по тегам