3

クライアントが接続できるサーバーアプリケーションをJavaで構築しました。クライアントが x 秒ごとに小さなメッセージを送信するハートビート システムを実装しました。サーバー側では、クライアントがメッセージを送信した時間を HashMap に保存し、すべてのクライアントに対して TimerTask を使用して、クライアントからメッセージを受信したかどうかを x 秒ごとに確認します。

少量のクライアントではすべて正常に動作しますが、クライアントの数が増えると (2k+)、メモリ量が非常に大きくなり、Times は多くの TimerTask を処理する必要があり、プログラムは多くの CPU を消費し始めます。

これを実装するより良い方法はありますか?データベースを使用して、一定時間更新を送信しなかったクライアントを選択することを考えました。これはうまくいくと思いますか、それともより良い方法だと思いますか。

4

1 に答える 1

3

いくつかのランダムな提案:

  • クライアントごとに 1 つのタイマーを使用する代わりに、受信したハートビートのマップを頻繁に (1 秒あたり 10 回など) 調べるグローバル タイマーを 1 つだけ使用します。そのマップを反復処理して、死んだクライアントを見つけます。共有データ構造のスレッドセーフについて覚えておいてください!

  • のような軽量のインメモリ DB を使用します。しかし、それでもやり過ぎのように聞こえます。

  • キャッシュまたはその他の有効期限が切れるマップを使用し、何かが削除されるたびに通知を受けます。このようにして、クライアントがハートビートを送信したときに基本的にマップに何かを配置し、そのエントリに一定時間内に何も起こらなかった場合、マップの実装はそれを削除して、ある種のリスナーを呼び出します。

  • Akka のようなアクターベースのシステムを使用します (Java API を備えています)。1 つのクライアントを処理するサーバー側で 1 つのアクターを使用できます。1 つのスレッド/タイマーよりもはるかに効率的です。

  • キューなど、別のデータ構造を使用してください。ハートビートを受信するたびに、クライアントをキューから削除し、最後に戻します。ここで、キューの先頭のみを定期的にチェックします。これには、常に最も古いハートビートを持つクライアントが含まれている必要があります。

于 2012-11-17T18:56:35.817 に答える