Ignite Java Thin Client - сбой подключения, когда один узел не работает - PullRequest
0 голосов
/ 24 сентября 2019

У нас есть кластер воспламенения с 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;
    }

1 Ответ

0 голосов
/ 24 сентября 2019

Эта ошибка будет исправлена ​​в Apache Ignite 2.8: IGNITE-11599

Возможно, это уже исправлено в GridGain, который возвращает такие исправления.

...