どのように私は、ハートビートが送信された「生き続ける」を保証することができますか?
-
21-08-2019 - |
質問
私たちは、サーバアプリケーションに定期的に「生き続ける」メッセージを送信する必要があるJavaで書かれたRMIクライアントアプリケーションを持っています。私たちは、その後のThread.sleep()を使用して15秒間スリープし、サーバーに滞在アライブメッセージを送信し、別のハートビートスレッド、としてこれを実装しています。
スレッドが高優先度に設定されている
Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();
クライアントは、CPUの多くを使用して実行されているボックスは、我々はハートビートが失われていることを見つけたとき、しかし、これは私たちのクライアントアプリケーションが死亡したと仮定して、サーバーが発生します。
私たちはThread.yieldを(追加している)、これは問題が離れて行く行っていないが、私のメインスレッドで呼び出されます。
私のアプリケーションがまだ実行されている間、ハートビートが時間通りに送信されることを保証する方法はありますか?
解決
あなたは自由にあなたのコード内で自己書かれた「歩留まり」機能を散乱させることによって非スレッド環境でユーザーモードのスレッドを実装することができます。
同様に、あなたのコード内のハートビートチェック機能の呼び出しを自由に飛散することができます。スレッドを見送る、単に定期的にハートビートがまだ送信する必要があるかどうかを確認し、ハートビート関数を呼び出します。
これは、粗溶液だが、あなたは適切な解決策を試してみたし、それが動作しません与えられた、おそらくそれはあなたが戻って落下する必要があり何かます。
実際にはあなたが何ができるかは、時間の簡単なチェックを行い、ハートビート機能を呼び出すすべての関数呼び出しの開始時にマクロを配置するときに必要に応じています。
-(しかし、あなたのアイデアを得る?ああ、私はないと思うあなたはJavaでマクロを持っています)。
他のヒント
あなたは本当にそれを保証することはできません。あなたはそれがあなたの遅延に追加されたハートビートを送信するのにかかる時間を防止するために、別のスレッドでハートビートを送信することができます。また、サーバーは、クライアントが自分のクライアントアウトサーバー回15秒後には、(しよう)、ハートビートごとに7.5秒を送信する場合、すなわち、死んでいる。決定するために使用する半分の時間に2つのハートビートの間の遅延を設定することをお勧めかもしれ
これは、CPUを使用しているどのようなプロセスによって異なります。
それが応答しないので、クライアント・プロセスが本当にあなたのプロセスではない、とした場合、それは、すべての意図や目的に生きていないので、heartbeartを送信しないことは適切です。言うハートビートメッセージを持つ「私はアップだとのメッセージを処理することができます」ボックスがあまりにも行うにロードされたときにそれは誤解を招くだろう。
ハートビートメッセージの意図が言うのであれば「このプロセスが実行されているが、私はあなたに戻って取得するまで、それは半分の時間であるかもしれない」は、その処理がサーバにそのメッセージを送るやっているものは何でも持っています。またはクライアントの応答性とフィットするものにタイムアウトを設定します。
あなたは、サーバーがクライアントが利用できないことを決定する前に待機する「見逃したハートビート」の数を設定する必要があります。
あなたのハートビート間隔は15秒で、逃した心拍数が4である場合は、ですから、例えば、サーバは、クライアントが到達不能であることを決定する前に60秒(1分)の最大件まで待ちます。
おそらく最良の解決策は、Timerの<のhref = "http://java.sun.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTaskを使用することです、%20long、%20long)」RELは= "nofollowをnoreferrer"> scheduleAtFixedRateする。これにより、(Javaで避けることができない)一つの実行遅れた場合、以降の呼び出しには影響しません。
は、開いているソケットを提示したほうが良いかもしれません。あなたのクライアントでは、単にそのソケットから読み取ります。 (サーバーは何も書いていないので)それはブロックします、そして、サーバが消えた場合/はサーバソケット/ポートが消えていることを示すにIOExceptionを取得します、あなたのクライアントをシャットダウンします。
これはタイムリーハートビートを提供するサーバに依存することはありません。これは、いくつかのリソース(TCPサーバ側のポートとなし、帯域幅の隣)を使用し、サーバ(またはサーバマシン)が使用できなくなったときに、それは明らかではタイムリーです。