Как загрузить лидер баланса с помощью zookeeper и Spring интеграции - PullRequest
0 голосов
/ 22 декабря 2018

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

Однако как мы можем распределить ответственность лидера по всем узлам в кластере для балансировки нагрузки?

Приведенный ниже код, как только приложение запускается, я вижу, что этот же узел поддерживает роль лидера и извлекает события.Я хочу распределить это действие на каждый узел в кластере, чтобы улучшить баланс нагрузки.

Можно ли как-то запланировать каждый узел в кластере, чтобы получить лидерство и отозвать в циклическом порядке?

    @Bean
    public LeaderInitiatorFactoryBean fooLeaderInitiator(CuratorFramework client) {
        new LeaderInitiatorFactoryBean()
                .setClient(client)
                .setPath("/foofeed")
                .setRole("foo");
    }

    @Bean
    @InboundChannelAdapter(channel = "fooIncomingEvents", autoStartup = "false", poller = @Poller(fixedDelay = "5000"))
    @Role("foo")
    public FooTriggerMessageSource fooInboundChannelAdapter() {
        new FooMessageSource("foo")
    }

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

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

То, что вы, вероятно, хотите, этоконкурирующие опрашивающие устройства, где все опрашивающие устройства активны, но используют общее хранилище для предотвращения дублирующейся обработки.

Например, если вы опрашиваете общий каталог для обработки файлов, вы должны использовать FileSystemPersistentFileListFilter с общим MetadataStore (например, реализация zookeeper), чтобы запретить нескольким экземплярам обрабатывать один и тот же файл.

Вы можете использовать один и тот же метод (хранилище общих метаданных) для любого источника опрошенных сообщений.

0 голосов
/ 22 декабря 2018

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

@Bean
public LeaderInitiator fooLeaderInitiator(CuratorFramework client, 
        FooPollingCandidate fooPollingCandidate) {
    LeaderInitiator leader = new LeaderInitiator(client, fooPollingCandidate, zooKeeperNamespace)
    leader.start()
    leader
}

@Component
class FooPollingCandidate extends DefaultCandidate {
    final Logger log = LoggerFactory.getLogger(this.getClass());

    FooPollingCandidate() {
        super("fooPoller", "foo")
    }

    @Override
    void onGranted(Context ctx) {
        log.debug("Leadership granted {}", ctx)
        pullEvents()
        ctx.yield();
    }

    @Override
    void onRevoked(Context ctx) {
        log.debug("Leadership revoked")
    }

    @Override
    void yieldLeadership() {
        log.debug("yielding Leadership")
    }

    //pull events and drop them on any channel needed
    void pullEvents() {
        log.debug("fetching events")
        //simulate delay
        sleep(5000)
    }
}
...