Spring Integration Zookeeper — я лидирую в настоящее время

Разверните приложение Spring Integration 4.3.8 на нескольких экземплярах Tomcat, и приложение использует org.springframework.integration:spring-integration-zookeeper:4.3.8.RELEASE для запуска нескольких экземпляров приложения в кластере, где только один за раз избирается лидером.

Вопрос в том, как проще всего узнать из приложения, являюсь ли я в настоящее время лидером или нет? Могу ли я получить эту информацию через доступный API Curator/Zookeeper? Или мне нужно создать какой-то прослушиватель событий?


person Going Bananas    schedule 12.04.2017    source источник


Ответы (1)


Надеюсь, вы используете LeaderInitiator.

Когда ему предоставляется роль лидера, выдается OnGrantedEvent. Это даже имеет свойство Context. А тот, в свою очередь, имеет состояние isLeader().

вы можете сохранить этот объект для будущего использования и проверять его isLeader() всякий раз, когда вам нужно.

Поскольку версия 5.0 LeaderInitiator обеспечивает прямой доступ к контексту:

/**
 * The context of the initiator or null if not running.
 * @return the context (or null if not running)
 * @since 5.0
 */
public Context getContext() {
    if (this.leaderSelector == null) {
        return NULL_CONTEXT;
    }
    return this.context;
}
person Artem Bilan    schedule 12.04.2017
comment
Вы также можете вызвать isRunning() на одной из конечных точек; это должно быть правдой, только если вы лидер. - person Gary Russell; 12.04.2017
comment
@GaryRussell, наши конечные точки были переопределены, поскольку у нас есть бизнес-кейсы, когда мы хотим, чтобы некоторые конечные точки не запускались, даже когда развертывание становится ведущим. Фактически, именно поэтому мы ищем способ узнать, являемся ли мы лидером или нет, чтобы мы могли вызывать super.start() на переопределенных конечных точках только в том случае, если hasLeadership = true. Поэтому в данном случае запрос isRunning() на конечной точке для нас не работает. - person Going Bananas; 12.04.2017
comment
Хорошо, @PonderMuse! Интересно, подходит ли мой ответ для вашего варианта использования. - person Artem Bilan; 12.04.2017
comment
@Артем, а где доступна версия 5.0? В настоящее время мы используем версию 4.3.8, которая является последней версией Maven. Версия 5.0 находится где-нибудь в репозитории моментальных снимков? Получение доступа к CuratorContext и вызов isLeader() на нем должно помочь. - person Going Bananas; 12.04.2017
comment
Последний — M3: spring. io/blog/2017/04/05/. Но, как я уже сказал: вы обрабатываете OnGranted/OnRevoked событий, чтобы получить эти Context для будущих целей. Если нет события, то нет Context и, следовательно, вы не лидер. Это как обходной путь до 5.0 GA если что. Однако мы можем рассмотреть возможность резервного копирования этого getContext()... На тот случай, если вы действительно не можете придумать решение без этого, бесплатно создайте соответствующую JIRA: jira.spring.io/browse/INT - person Artem Bilan; 12.04.2017
comment
@ArtemBilan, понял. Теперь мы переопределили конечные точки, которые реализуют ApplicationListener<AbstractLeaderEvent> и используют эти события .getContext().isLeader(), чтобы отслеживать, являемся ли мы лидером или нет. Мы запустили несколько тестовых сценариев в кластере из двух узлов, и теперь мы получаем нужное поведение, используя 4.3.8. - person Going Bananas; 12.04.2017