当前位置: 首页 > 知识库问答 >
问题:

点燃Java瘦客户机-当一个节点关闭时连接失败

鲜于海
2023-03-14

我们有一个带有3个节点的ignite集群,所有服务都使用java瘦客户机连接到集群。

理想情况下,我们希望它回退到其他节点,因为集群中有其他节点可用。我们看到上面提到的逻辑是在ReliableChannel类的service方法中实现的。

对象构造过程中没有实现回退而只在服务方法上有它(连接到其他节点的任何选项)有什么具体的原因吗?

还有,我们可以控制节点连接的顺序吗?

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个答案

劳昊明
2023-03-14

这个问题将在Apache Ignite 2.8:IGNITE-11599中解决

也许它已经在GridGain中修复了,它支持这样的修复。

 类似资料:
  • 我正在尝试构建一个apache ignite thinclient poc,并且能够连接到集群,还可以使用ScanQuery读取数据。但我仍然停留在为任何缓存更新创建一个监听器上。我翻阅了一下,但找不到瘦客户机的任何东西。ignite瘦客户端是否支持侦听缓存更新?我该怎么做?

  • 我试图在Kubernetes环境中通过瘦客户机使用Ignite和我的java应用程序设置一个分布式缓存。 在我的Kubernetes集群中,我有两个带有java应用程序的pods和两个Ignite的pods。为了让java Pod与ignite Pod通信,我配置了一个瘦客户机来连接ignite kubernetes服务。通过这种配置,我希望负载平衡在kubernetes一侧。下面是我在java代

  • 我是ignite的新手,并尝试使用示例https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/client/clientputgetexample.java null

  • 我想知道以下问题的答案: 1)如果Ignite服务器重新启动,我需要重新启动客户端(web应用程序)。是否有任何方法可以在服务器重新启动时重新连接到服务器。我知道当服务器重新启动时,它分配了一个不同的ID,因此当前现有的连接变得过时。是否有方法克服这个问题,如果是的话,哪一个版本的Ignite支持这个功能。目前我使用1.7版本 3)如果我有一个大对象要缓存,我发现序列化和反序列化在Ignite中需

  • 根据消息,进程将重试并等待服务器节点加入,我认为这是默认行为!但是有没有办法为等待或最大重试次数设置超时呢?因为我不希望我的进程等待超过10秒。 下面是我用来启动ignite客户端的配置。