重新连接Hazelcast客户端

时间:2017-01-18 06:56:11

标签: java hazelcast

我们使用Java Hazelcast客户端连接到外部Hazelcast群集(版本3.7.2),但如果群集出现故障,则会出现重新连接问题。

我们正在使用HazelcastClient.newHazelcastClient创建客户。完成后,我们会保留HazelcastInstance的副本并使用它来与Hazelcast群集(getMapgetSet等进行交互)。我们还存储了从HazelcastInstance中可能长寿的对象中获得的地图,集合等。幸福的道路上一切都很好。但是,如果群集出现故障并重新启动,则在尝试访问在群集关闭之前创建的这些对象时,我们会获得HazelcastInstanceNotActiveException

当群集重新联机时,有没有办法自动重新建立客户端连接,以便我们可以继续使用我们之前从群集关闭之前从Hazelcast检索到的对象(地图,集等)?或者我们是否需要有额外的代码来捕获HazelcastInstanceNotActiveException,然后重建HazelcastInstance以及我们存储在客户端应用程序中的任何对象?后者似乎非常具有侵略性,在我们存储其中一个Hazelcast对象的每个实例中都无法处理。

我读过的大部分内容都涉及连接超时,尝试限制和尝试超时的NetworkConfig设置。我们当前正在使用默认值,但在访问我们已经检索过的对象时,它们似乎没有做任何事情。即使在群集备份后,对{1}​​}的任何对先前存在的对象的访问都会立即失败。

这似乎是很多人会遇到的常见问题。处理这个问题的最佳做法是什么?

2 个答案:

答案 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提供关于如何处理重新连接的自定义策略,如指数退避,但这样的事情还不存在。