我们使用Java Hazelcast客户端连接到外部Hazelcast群集(版本3.7.2),但如果群集出现故障,则会出现重新连接问题。
我们正在使用HazelcastClient.newHazelcastClient
创建客户。完成后,我们会保留HazelcastInstance
的副本并使用它来与Hazelcast群集(getMap
,getSet
等进行交互)。我们还存储了从HazelcastInstance
中可能长寿的对象中获得的地图,集合等。幸福的道路上一切都很好。但是,如果群集出现故障并重新启动,则在尝试访问在群集关闭之前创建的这些对象时,我们会获得HazelcastInstanceNotActiveException
。
当群集重新联机时,有没有办法自动重新建立客户端连接,以便我们可以继续使用我们之前从群集关闭之前从Hazelcast检索到的对象(地图,集等)?或者我们是否需要有额外的代码来捕获HazelcastInstanceNotActiveException
,然后重建HazelcastInstance
以及我们存储在客户端应用程序中的任何对象?后者似乎非常具有侵略性,在我们存储其中一个Hazelcast对象的每个实例中都无法处理。
我读过的大部分内容都涉及连接超时,尝试限制和尝试超时的NetworkConfig
设置。我们当前正在使用默认值,但在访问我们已经检索过的对象时,它们似乎没有做任何事情。即使在群集备份后,对{1}}的任何对先前存在的对象的访问都会立即失败。
这似乎是很多人会遇到的常见问题。处理这个问题的最佳做法是什么?
答案 0 :(得分:2)
在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>
答案 1 :(得分:1)
正如您已经读过的那样,将连接尝试的值设置为Integer.MAX_VALUE并使尝试之间的持续时间更长,这是您前往的目的。
目前没有其他方法可以解决这个问题。我想象一个极简主义的SPI提供关于如何处理重新连接的自定义策略,如指数退避,但这样的事情还不存在。