Hazelcast - 客户端模式 - 集群故障后如何恢复?

Hazelcast - Client mode - How to recover after cluster failure?

我们正在我们的产品中使用 hazelcast 分布式锁和缓存功能。分布式锁的使用对我们的业务逻辑至关重要。

目前我们使用的是嵌入式模式(每个应用节点也是一个hazelcast集群成员)。我们将切换到客户端-服务器模式。

我们注意到客户端-服务器的问题是,一旦集群停机一段时间后,经过几次尝试,客户端就会被销毁,并且从该客户端检索到的任何对象(地图、集合等)都会被销毁。不再可用。 此外,即使在 Hazelcast 集群恢复后客户端实例也不会恢复(我们收到 HazelcastInstanceNotActiveException )

我知道这个问题已经解决了好几次并最终成为一个功能请求:

issue1

issue2

issue3

我的问题:恢复客户端的策略应该是什么?目前我们正计划在客户端进程中排队任务,如下所示。根据条件,它将尝试重新启动客户端实例... 我们将通过 clientInstance.getLifecycleService().isRunning() check.

检查客户端是否为 运行

任务代码如下:

private class ClientModeHazelcastInstanceReconnectorTask implements Runnable {

    @Override
    public void run() {
        try {
            HazelCastService hazelcastService = HazelCastService.getInstance();
            HazelcastInstance clientInstance = hazelcastService.getHazelcastInstance();
            boolean running = clientInstance.getLifecycleService().isRunning();
            if (!running) {
                logger.info("Current clientInstance is NOT running. Trying to start hazelcastInstance from ClientModeHazelcastInstanceReconnectorTask...");
                hazelcastService.startHazelcastInstance(HazelcastOperationMode.CLIENT);
            }
        } catch (Exception ex) {
            logger.error("Error occured in ClientModeHazelcastInstanceReconnectorTask !!!", ex);
        }
    }

}

这种做法合适吗?我也尝试过监听 LifeCycle 事件,但无法通过事件使其工作。

此致

在 Hazelcast 3.9 中,我们更改了连接和重新连接在客户端中的工作方式。您可以在文档中阅读有关新行为的信息:http://docs.hazelcast.org/docs/3.9.1/manual/html-single/index.html#configuring-client-connection-strategy

希望对您有所帮助。

在 Hazelcast 3.10 中,您可以将连接尝试限制从 2(默认)增加到最大值:

ClientConfig clientConfig = new ClientConfig(); clientConfig.getNetworkConfig().setConnectionAttemptLimit(Integer.MAX_VALUE);