Это хорошая идея, чтобы посмотреть / zookeeper / config изменения, чтобы обновить строку подключения куратора? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу, чтобы мой клиент zookeeper (Curator Framework) следил за обновлением серверов при изменении конфигурации кворума, поэтому мне пришла в голову идея добавить прослушиватель (Curator NodeCache) для просмотра / zookeeper / config. Когда конфигурация кворума изменится, клиент получит события и получит обновленное значение в / zookeeper / config, а затем извлечет последнюю строку полного подключения, которая содержит все современные узлы zookeeper.

Соответственно, клиент-куратор использует EnsembleProvider вместо строки подключения. При изменении кворума EnsembleProvider всегда знает о последнем списке серверов, поэтому он может предоставить правильную строку подключения. Псевдокод выглядит так

AtomicReference<List<String>> connectStringHolder = new AtomicReference<>(new ArrayList<>());

// initial connect string
connectStringHolder.get().add("<initial server string>");

CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();

// EnsembleProvider instead of plain connect string
builder.ensembleProvider(new EnsembleProvider() {
    // when zookeeper client needs a connect string
    public String getConnectionString() {
        final String join = String.join(",", connectStringHolder.get());
        return join;
    }
});

final CuratorFramework curatorFramework = builder.build();
curatorFramework.start();

// watch changes on /zookeeper/config
NodeCache nodeCache = new NodeCache(curatorFramework,"/zookeeper/config");
nodeCache.getListenable().addListener(new NodeCacheListener() {
    @Override
    public void nodeChanged() throws Exception {
        final byte[] data = nodeCache.getCurrentData().getData();
        List<String> newServersFromConfig = extract(data);

        // update connectStringHolder
        connectStringHolder.set(strings);
    }
});
nodeCache.start();

Не знаете, хорошая ли это идея?

1 Ответ

0 голосов
/ 24 марта 2020

Куратор уже отслеживает узел конфигурации для вас (через EnsembleTracker внутри). Вы всегда можете получить текущую конфигурацию через CuratorFramework.getCurrentConfig(). Вам не нужно делать это самостоятельно.

...