我们在我们的产品中使用hazelcast分布式锁和缓存功能。分布式锁定的使用对于我们的业务逻辑至关重要。
目前我们使用的是嵌入式模式(每个应用程序节点也是hazelcast集群成员)。我们将切换到客户端-服务器模式。
我们注意到客户端-服务器的问题是,一旦集群关闭一段时间,经过几次尝试后,客户端将被销毁,并且从该客户端检索到的任何对象( map 、集合等)将不再存在可用。 此外,即使 Hazelcast 集群恢复,客户端实例也不会恢复(我们收到 HazelcastInstanceNotActiveException )
我知道这个问题已被多次解决并最终成为一个功能请求:
我的问题:恢复客户端的策略应该是什么?目前我们计划在客户端进程中排队一个任务,如下所示。根据条件,它将尝试重新启动客户端实例... 我们将通过 clientInstance.getLifecycleService().isRunning() 检查来检查客户端是否正在运行。
这是任务代码:
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
我希望这会有所帮助。
关于java - Hazelcast - 客户端模式 - 集群故障后如何恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572092/