У нас есть кластер воспламенения с 3 узлами, и все службы подключаются к кластеру с помощью тонкого клиента Java.
Когда один из узлов сервера выходит из строя и службы пытаются подключиться, немногие получают успешное соединение, и некоторые терпят неудачу с ошибкой зажигания кластера.поэтому мы отладили источник и обнаружили, что во время создания объекта ReliableChannel он выбирает случайный узел для соединения и, если этот узел недоступен, он генерирует исключение соединения клиента.
В идеале мы ожидаем, что он откроется для других узлов, так как другие узлы доступны в кластере.мы видим, что вышеупомянутая логика реализована в методе обслуживания класса ReliableChannel.
Есть ли какая-либо конкретная причина для того, чтобы не реализовывать откат при построении объекта, и использовать его только в методе обслуживания (любые варианты подключения к другим узлам)?
Кроме того, можем ли мы в любом случае контролировать порядок подключения узлов?
Фрагмент кода ReliableChannel
ReliableChannel(
Function<ClientChannelConfiguration, Result<ClientChannel>> chFactory,
ClientConfiguration clientCfg
) throws ClientException {
if (chFactory == null)
throw new NullPointerException("chFactory");
if (clientCfg == null)
throw new NullPointerException("clientCfg");
this.chFactory = chFactory;
this.clientCfg = clientCfg;
List<InetSocketAddress> addrs = parseAddresses(clientCfg.getAddresses());
primary = addrs.get(new Random().nextInt(addrs.size())); // we already verified there is at least one address
ch = chFactory.apply(new ClientChannelConfiguration(clientCfg).setAddress(primary)).get();
for (InetSocketAddress a : addrs)
if (a != primary)
this.backups.add(a);
}
public <T> T service(
ClientOperation op,
Consumer<BinaryOutputStream> payloadWriter,
Function<BinaryInputStream, T> payloadReader
) throws ClientException {
ClientConnectionException failure = null;
T res = null;
int totalSrvs = 1 + backups.size();
svcLock.lock();
try {
for (int i = 0; i < totalSrvs; i++) {
try {
if (failure != null)
changeServer();
if (ch == null)
ch = chFactory.apply(new ClientChannelConfiguration(clientCfg).setAddress(primary)).get();
long id = ch.send(op, payloadWriter);
res = ch.receive(op, id, payloadReader);
failure = null;
break;
}
catch (ClientConnectionException e) {
if (failure == null)
failure = e;
else
failure.addSuppressed(e);
}
}
}
finally {
svcLock.unlock();
}
if (failure != null)
throw failure;
return res;
}