我们正在使用 Java Hazelcast 客户端连接到外部 Hazelcast 集群(版本 3.7.2),但如果集群出现故障,则在重新连接时会遇到问题。
我们正在使用 HazelcastClient.newHazelcastClient
创建我们的客户端。一旦我们这样做,我们将保留 HazelcastInstance
的副本并使用它与 Hazelcast 集群(getMap
、getSet
等)进行交互。 ).我们还将我们从 HazelcastInstance
获得的 map 、集合等存储在可能长期存在的对象中。在快乐的道路上一切正常。但是,如果集群曾经关闭并重新启动,我们在尝试访问这些在集群关闭之前创建的对象时会得到 HazelcastInstanceNotActiveException
。
有没有一种方法可以在集群重新联机时自动重新建立客户端连接,以便我们可以继续使用我们之前在集群出现故障之前从 Hazelcast 检索到的对象( map 、集合等)?或者我们是否需要额外的代码来捕获 HazelcastInstanceNotActiveException
,然后重建 HazelcastInstance
以及我们存储在客户端应用程序中的任何对象?后者似乎是非常具有侵入性的,并且在我们存储这些 Hazelcast 对象之一的每个实例中绝对不希望处理。
我读过的大部分内容都涉及连接超时、尝试限制和尝试超时的 NetworkConfig
设置。我们目前正在使用默认值,但在访问我们已经检索到的对象时它们似乎没有做任何事情。即使在集群备份后,对先前存在的对象的任何访问也会立即失败并返回 HazelcastInstanceNotActiveException
。
这似乎是许多人会遇到的常见问题。处理此问题的最佳做法是什么?
最佳答案
在 Hazelcast 3.11 中发布了指数退避客户端重新连接策略:https://docs.hazelcast.org/docs/latest/manual/html-single/#configuring-client-connection-retry .
<hazelcast-client>
...
<connection-strategy async-start="false" reconnect-mode="ON">
<connection-retry enabled="true">
<initial-backoff-millis>1000</initial-backoff-millis>
<max-backoff-millis>60000</max-backoff-millis>
<multiplier>2</multiplier>
<fail-on-max-backoff>true</fail-on-max-backoff>
<jitter>0.5</jitter>
</connection-retry>
</connection-strategy>
...
</hazelcast-client>
关于java - 重新连接 Hazelcast 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41713135/