2017-01-18 13 views
7

Java Hazelcastクライアントを使用して外部Hazelcastクラスタ(バージョン3.7.2)に接続していますが、クラスタが停止した場合に再接続する際に問題があります。Hazelcastクライアントの再接続

HazelcastClient.newHazelcastClientでクライアントを作成しています。これを実行したら、HazelcastInstanceのコピーを保持し、それを使用してHazelcastクラスタ(getMapgetSetなど)とやりとりします。我々はまた、HazelcastInstanceから入手したマップ、セットなどを、潜在的に寿命の長いオブジェクトに格納しています。幸せな道ではすべてがうまくいく。ただし、クラスタがダウンして復旧した場合、クラスタがダウンする前に作成されたこれらのオブジェクトにアクセスしようとすると、HazelcastInstanceNotActiveExceptionが表示されます。

クラスタがオンラインに戻ったときに自動的にクライアント接続を再確立して、クラスタがダウンする前にHazelcastから以前に取得したオブジェクト(マップ、セットなど)を使用して再開できる方法はありますか?または、HazelcastInstanceNotActiveExceptionをキャッチして、HazelcastInstanceと私たちがクライアントアプリケーションに保存したオブジェクトを再構築するコードを追加する必要がありますか?後者は、これらのHazelcastオブジェクトのいずれかを格納するそれぞれのインスタンスで対処することは、非常に侵襲的で、間違いなく望ましくないようです。

私が読んだことのほとんどは、接続タイムアウト、試行制限、試行タイムアウトの設定についてはNetworkConfigを参照してください。現在はデフォルト値を使用していますが、すでに取得したオブジェクトにアクセスするときには何もしないようです。以前に存在したオブジェクトへのアクセスは、クラスタのバックアップが完了した後でもすぐにHazelcastInstanceNotActiveExceptionで失敗します。

これは多くの人々が遭遇する共通の問題のようです。これに対処するベストプラクティスは何ですか?

答えて

1

設定を読み込んでいる間は、接続の値はInteger.MAX_VALUEになりますが、試行間の間隔を長くすると、どこに向かうのかがわかります。

現時点では、この問題を解決する他の方法はありません。指数バックオフのように再接続を処理する方法に関するカスタム戦略を提供するための最小限のSPIを想像していますが、そのようなことはまだ存在しません。

+0

接続の試行回数をInteger.MAX_VALUEに増やすと、クラスタが停止している間に無期限にブロックされます。トラフィック負荷がかなり高いため、クラスタが復旧するまで要求をすべてキューに入れることはできません。 'HazelcastInstance'は動作しているかどうか(' getLifecycleService().isRunning() ')を知っていますので、もし実行されていなければ直ちに失敗しますが、あらかじめ定義された戦略に基づいてバックグラウンドでX秒数、指数バックオフなど)。このようなことは可能ですか? – nolt2232

+0

機能リクエストはgithubで作成してください。その方法はブロックされるように設計されているので、あなたが求めているのは完璧な意味合いを持っていますが、現在のアプローチから大きな変化です。あなたは、非同期操作を見て、タイムアウト後にそれらを殺すことができますか? – noctarius

+1

ご意見ありがとうございます。私はここで機能リクエストを提出しました:https://github.com/hazelcast/hazelcast/issues/9692 – nolt2232

関連する問題