Я хочу, чтобы мой клиент 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();
Не знаете, хорошая ли это идея?