Java Hazelcastクライアントを使用して外部Hazelcastクラスタ(バージョン3.7.2)に接続していますが、クラスタが停止した場合に再接続する際に問題があります。Hazelcastクライアントの再接続
HazelcastClient.newHazelcastClient
でクライアントを作成しています。これを実行したら、HazelcastInstance
のコピーを保持し、それを使用してHazelcastクラスタ(getMap
、getSet
など)とやりとりします。我々はまた、HazelcastInstance
から入手したマップ、セットなどを、潜在的に寿命の長いオブジェクトに格納しています。幸せな道ではすべてがうまくいく。ただし、クラスタがダウンして復旧した場合、クラスタがダウンする前に作成されたこれらのオブジェクトにアクセスしようとすると、HazelcastInstanceNotActiveException
が表示されます。
クラスタがオンラインに戻ったときに自動的にクライアント接続を再確立して、クラスタがダウンする前にHazelcastから以前に取得したオブジェクト(マップ、セットなど)を使用して再開できる方法はありますか?または、HazelcastInstanceNotActiveException
をキャッチして、HazelcastInstance
と私たちがクライアントアプリケーションに保存したオブジェクトを再構築するコードを追加する必要がありますか?後者は、これらのHazelcastオブジェクトのいずれかを格納するそれぞれのインスタンスで対処することは、非常に侵襲的で、間違いなく望ましくないようです。
私が読んだことのほとんどは、接続タイムアウト、試行制限、試行タイムアウトの設定についてはNetworkConfig
を参照してください。現在はデフォルト値を使用していますが、すでに取得したオブジェクトにアクセスするときには何もしないようです。以前に存在したオブジェクトへのアクセスは、クラスタのバックアップが完了した後でもすぐにHazelcastInstanceNotActiveException
で失敗します。
これは多くの人々が遭遇する共通の問題のようです。これに対処するベストプラクティスは何ですか?
接続の試行回数をInteger.MAX_VALUEに増やすと、クラスタが停止している間に無期限にブロックされます。トラフィック負荷がかなり高いため、クラスタが復旧するまで要求をすべてキューに入れることはできません。 'HazelcastInstance'は動作しているかどうか(' getLifecycleService().isRunning() ')を知っていますので、もし実行されていなければ直ちに失敗しますが、あらかじめ定義された戦略に基づいてバックグラウンドでX秒数、指数バックオフなど)。このようなことは可能ですか? – nolt2232
機能リクエストはgithubで作成してください。その方法はブロックされるように設計されているので、あなたが求めているのは完璧な意味合いを持っていますが、現在のアプローチから大きな変化です。あなたは、非同期操作を見て、タイムアウト後にそれらを殺すことができますか? – noctarius
ご意見ありがとうございます。私はここで機能リクエストを提出しました:https://github.com/hazelcast/hazelcast/issues/9692 – nolt2232