0

次のユースケースに最適な設計を探しています。

ユーザーが終了日時でエンティティを作成するシステムを構築しています。終了時刻に達したらすぐに、これらのエンティティのステータスを期限切れに変更するジョブをスケジュールする必要があります。

これらは私が考えることができる2つの解決策です

  • ジョブは毎分実行され、クエリを実行して期限切れのエンティティを確認します (endTime > sysdate)。問題: データベースに負荷がかかります。このクエリを毎分実行すると、データベースに負荷がかかる場合があります。
  • エンティティが作成されるとすぐに、各エンティティのジョブをスケジュールします。 問題: システムで作成されるジョブが多すぎます。これらのエンティティが毎日 1000 個作成されます。

上記の2つよりも良い解決策はありますか? 人々は一般的にこれをどのように行うのですか?

4

2 に答える 2

0

1分ごとのクエリは、それほど大きな負荷ではありません。私は次のことを行うWindowsサービスを持っています:

VoIPセッションのスケジュールを管理し、開始、終了、記録の開始、記録の終了、記録ドライブの記録スペースのクリア、OSDメッセージの表示を行います。これらの各タスクはタイマー付きの独自のスレッドにあり、約4秒ごとにクエリを実行します。データベースには100,000を超えるレコードがあり、この同じデータベースに一度にアクセスするWebアプリのユーザーは数百人に上ります。正常に動作し、約3年になります。

フレームワークによっては、より良いオプションがあるかもしれませんが、現時点では見つかりません。たとえば、.NETにはまだ使用していないタスク並列ライブラリがありますが、ここで提供できるものがいくつかあると聞きました。とにかく、私はアプローチ#1を何年も使用してきましたが、それが私を間違ったことは一度もありません。

あなたがそれについて考えるとき、イベントベースのシステムでさえ、いくつかの関数ポインタでどこかでループに座っています。問題は、手動で管理しているかどうか、およびどのようにスレッド化されているかです。dbの負荷は重要ではありません。

于 2011-09-03T05:35:21.233 に答える
0

2つのアイデアを組み合わせることができると思います。

データを取得するジョブを 1 時間ごとに実行します。ここで、次の 60 分で期限切れになるオブジェクトごとにジョブを作成します。

60 分の時間は単なる例です。必要に応じて変更してください。

于 2011-09-03T05:36:16.907 に答える