Spring boot Webservice / Микросервисы и планирование - PullRequest
0 голосов
/ 06 апреля 2020

У меня приложение весенней загрузки, которое предоставляет API REST, а также я планирую добавить запланированную задачу весенней загрузки.

Цель задачи состоит в том, чтобы получить несколько ожидающих «резервирований» из хранилища данных, которое является momgodb, и обработать его.

Теперь вопрос заключается в том, когда работает несколько экземпляров службы, существует высокая вероятность все узлы получат одинаковые «записи резервирования».

Я искал блокировку mongodb для этого и проверял updateAndModidy / транзакции (в 4.x) mongodb.

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

Поэтому вопрос касается нескольких экземпляров служб, выполняющих и планирующих задачи, как упомянуто выше. Я был бы признателен и признателен, если бы кто-нибудь мог указать на лучшие практики или решения по этой теме c независимо от технологий (spring boot / mongodb et c).

1 Ответ

1 голос
/ 06 апреля 2020

В зависимости от вашего развертывания, решение, которое работает для нас, состоит в том, чтобы создать кластер с узлами из того же приложения, используя Hazelcast, а затем, когда задача выполняется, все узлы проверяют, являются ли они главными, и только мастер запускает task.

Вы можете прочитать вступление о Hazelcast весной здесь: https://josdem.io/techtalk/spring/spring_boot_hazelcast_es/

Мы используем Hazelcast с Consul, поэтому нам не нужно настраивать ips / ports вручную, используя это: https://github.com/bitsofinfo/hazelcast-consul-discovery-spi

Если у вас не так много (dynamici c) узлов, это относительно простое решение, которое отлично работает для нас (3 узла, скоординированные развертывания с нулевым временем простоя с консулом / фабрикой от Jenkins)

Раньше мы позволяли планированию Quartz координировать все узлы, используя общий источник данных JDB C для Quartz в качестве механизма синхронизации, но реализация ошибочна, и время от времени мы получим блокировки TABLE, которые нам придется разблокировать вручную, убивая некоторые узлы.

Cheers

Редактировать:

Так выглядит один из наших классов:

// Optionally autowired, in case we don't run in a cluster (development)
private final Optional<HazelcastInstance> hazelcast;

    @Scheduled(cron = "${refresh.cron}")
    public void scheduledRefresh() {
        // Run if we are not in a cluster or 
        // we are the first member of the cluster
        if (!hazelcast.isPresent() || 
   hazelcast.get().getCluster().getMembers().iterator().next().localMember()) {
    // Run restricted method
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...