2012-05-03 5 views
1

私はそれぞれがデーモンを実行している100台のサーバを持っていると言います - それはserverと呼ばれます - そのサーバはこの特定のサービスの各ユーザ用のスレッドを生成する責任があります。各N秒ごとに何かを取得し、その特定のユーザーの情報を取得します(この要求/応答モデルは変更できません)。私が持っている問題は、時にはスレッドがハングし、実行を停止する場合があります何か。ユーザーのデータが古くなっていて、更新する必要があることを知るには何らかの方法が必要です。分散サーバモデル

は、私が持っている唯一のアイデアはlast_scanned列がある場合、すべての5N秒は、スレッドがそのユーザ(ユーザテーブルのlast_scanned列)に関連したMySQLのレコード、およびそのテーブルごと15N秒をチェックする別のプロセスを更新していています現在のスレッドではなく、スレッドを再起動します。

+0

スレッドが何かをやめるとき、その期待された動作か、それともエラーが原因ですか? – Jordan

+0

エラーのために - 私はスレッドがハングアップするように指定するべきです(そして、はい、私はエラーを修正して、これが最初に起こらないようにする必要がありますが、無視します) – v0idless

答えて

1

これを処理する一般的な方法は、スレッドがステータスをサーバーデーモンに戻すようにすることです。最後の5N秒以内に状態の更新が見られなかった場合は、スレッドを終了して別のスレッドを開始します。

リスト内でスピンアップした現在のアクティブなスレッドを追跡し、ときどきそれらをループして状態を判断できます。

もちろん、プログラムでスレッドが早すぎて終了する原因となっているエラーも修正する必要があります。

スレッドを早期に終了して殺すと、プログラムが予期せぬ非原子状態になる可能性があります。サーバーデーモンには、キュー内の項目や作業負荷を判断するために使用している項目が一定期間アクティブでなくなった場合にリセットされるクリーンアッププロセスが実行されているはずです。

+0

これは確かに良いmodleです。サーバデーモンが亡くなった場合(停電、ハードウェア障害など)何らかの永続的なストレージが必要なような気がしているので、サーバデーモンが死んでしまった場合、それを保持していたユーザやスキャンが必要なユーザを知ることになります。 – v0idless

+0

私はあなたにすでに何かの永続的なストレージがあると思っていました。一般的に、人々はこのようなことのためにキューを使用します。あなたはそれについてRabbitMQをチェックするかもしれません。 – Jordan