重新连接 Hazelcast 客户端

Reconnect a Hazelcast Client

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

我们正在使用 HazelcastClient.newHazelcastClient 创建我们的客户端。一旦我们这样做,我们将保留 HazelcastInstance 的副本并使用它与 Hazelcast 集群(getMapgetSet 等)进行交互。我们还将我们从 HazelcastInstance 获得的映射、集合等存储在潜在的长期对象中。在快乐的道路上一切正常。但是,如果集群曾经关闭并重新启动,我们会在尝试访问这些在集群关闭之前创建的对象时得到 HazelcastInstanceNotActiveException

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

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

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

正如您已经阅读的那样,将连接尝试的值设置为 Integer.MAX_VALUE 并延长尝试之间的持续时间是您要去的地方。

目前没有其他方法可以解决这个问题。我想象一个极简主义的 SPI 来提供关于如何处理重新连接的自定义策略,比如指数 back-off 但这样的事情还不存在。

在 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>