8

私たちの Web サイトで、アクション/イベントのスケジューリングを提供する必要があります。がらくたの例えは、人がカレンダー アイテムを追加し、日付/時刻が「ヒット」すると、いくつかのロジック (たとえば、レポートの計算) が起動されるカレンダー システムである可能性があります。

クライアントが入力するスケジュールされたイベントが何百、何千もある可能性があります。クライアントがスケジュールを設定するために何かを入力すると、その情報がデータベースに保存されます。次に、データベーステーブルの主キーを含むイベント/ジョブをどこかに追加すると思います。イベントが発生するときは、データベースからその情報を取得して、ロジックを実行します。終わり。

これを処理するための一般的な解決策は何ですか?

.NET 3.5 SP1 を使用しています。DB は Sql Server 2008 です。UI は Web ベースになります。

人々が MSMQ を使用しているかどうかはわかりませんでした。それともSql Serverに組み込まれたものですか?または、NT サービスを備えたオープン ソース ライブラリ (例: Quartz.NET )。サーバーは Windows 2008 Standard Edition になります。

また、同等の cron ジョブやコマンド ライン スクリプトなどを使用するよう提案しないでください。

最後に、これは二次的な目的です..シズとクスクスのためにこれを紺碧に投げたいと思います.それで、それも可能ですか? それは単なるウィッシュリストのアイデアです。Azure を使用するよりもソリューションが簡単な場合は、専用のボックスで行うことをお勧めします。

乾杯 :)

編集: イベントの発生が必要なときに処理するロジックは、バックグラウンド ジョブです。UI は必要ありません。

4

8 に答える 8

4

WorkflowFoundationはこれを行うことができます。Delayアクティビティを使用し、TimeSpanを(DesiredTimeOfExecution-Now)に設定します。大規模なシステムの場合は、UnloadOnIdleをtrueに設定すると、保留中のワークフローが必要になるまで保持されます。

これは、遅延アクティビティの非常に簡単な例です。

WFは無料で、.NETFramework3.0の一部として含まれています。

于 2009-06-19T05:08:28.027 に答える
2

必要なのはSQLServerServiceBrokerです。

時系列データベースにアクセスして、カレンダーデータなどをクエリできます。メッセージベースで、MSMQよりも強力で、ポーリングを必要とせず、必要に応じて分散環境で使用できます。私にとっては素晴らしい作品です!

ストアドプロシージャを実行して、イベント情報をデータベースのSSBキューに配置します。そのメッセージに将来、イベントデータを取得し、「外部アクティベーション」を実行するピックアップキューに入れる別のストアドプロシージャをウェイクアップして処理する時間を与えます。EAは、コンソールアプリを指すWindowsサービスに通知を送信します。そのコンソールアプリは、ピックアップキューからイベント情報を取得します。これで、必要な正確な時間にイベントデータを取得できます。コンソールアプリで好きなように処理します。

学習曲線はありますが、SQL Service Brokerが提供する信頼性、柔軟性、およびスケーラビリティーが必要な場合は、それだけの価値があります。以下はあなたが始めるためのいくつかのリンクです。

比較は次のとおりです。SQLServiceBrokerとMSMQ

残念ながら、SOは1つのリンクしか投稿できません。それ以外の場合は、SSBの使用を開始するのに役立つその他のリソースを紹介できます。

お役に立てれば!

于 2009-06-19T05:28:35.350 に答える
2

Quartz.NET は、おそらくこれらの要件も十分に処理できます。私が見る利点は、スケジューラ (CronTrigger + カレンダー) を設定するさまざまな方法と、テスト可能なコード (ジョブ) の小さな単位でジョブを実行できることです。

Quartz.NET は、必要な分散とクラスタリング機能によるフェイルオーバーも提供します。1 つの優れた機能は、トリガーごとに構成可能なミスファイア処理セットアップであり、ミスファイアとスケジューラのダウンタイムに対応する機会を提供します。

SQL Service Brokerにはポーリングがないという利点があるようですが、それが問題になるかどうかは疑問ですが、ブローカーには少し複雑に聞こえるという欠点があります(少なくとも上記の説明から)。

私の偏った0.02ドルです。

于 2009-06-30T23:16:50.620 に答える
1

これは、StackOverflow で既に議論されている問題です。asp.net でジョブ スケジューラが必要であることを確認してください。

質問に最も重要な情報を追加するのを忘れていました-ASP.Net

サービスのように実行でき、定期的に呼び出されるメソッドを提供し、ロジックを起動してイベントをロードし、タイマーを使用して有効なイベントをキューに入れることができる ASP.Net Web アプリのスケジューラ フレームワークについて説明します。

また、これはすべての選択肢の中で最も安価です。これがあなたが必要としていたものであることを願っています。

于 2009-06-19T04:17:04.343 に答える
1

1 つのオプションとして、最も細かい間隔で実行する SQL ジョブを作成し、すべてのイベントを処理することが考えられます。

.NET と SQL Server の両方の世界を最大限に活用したい場合は、SQL ジョブを使用してマネージ コードを呼び出すこともできます。私はこのソリューションの経験がないので、私が提供したリソースが十分でない場合は、前もってお詫び申し上げます.

タスクが非常に複雑で、アセンブリを SQL Server にロードしたくない場合、またはアセンブリのスケジューリング システムが気に入らない場合は、サード パーティのスケジューラ プラグインを使用した .NET Windows サービスをお勧めします。個人的には、すべてのコードをストアド プロシージャまたは一連のストアド プロシージャに保持できれば、管理がはるかに簡単で、多くの作業が既に行われていると思うので、仕事をしたいと思います。

編集

粒度を説明するコメントに気づきました。毎分実行する必要があるいくつかのアクションがある場合は、何らかのマルチスレッド ソリューションを実装する必要があるため、おそらく .NET サービス ソリューションの方が簡単でしょう。

于 2009-06-19T02:04:57.120 に答える
1

粒度が小さく、特定の分に発生するすべてのジョブが次の分までに終了するかどうかをアプリオリに知ることができる必要があるため、ジョブ スケジューラとジョブ マネージャーが必要になります。

これにより、スケジューラーの仕事が簡単になります。ジョブを格納する DB テーブルが必要であり、毎分、ジョブ スケジューラ サービスがそのテーブルに移動し、実行する必要があるジョブを選択する必要があります。

これらのジョブは、ジョブ マネージャーでキューに入れられます。別のテーブルまたはトランザクション キューを使用して、ジョブをキューに入れることができます。ジョブ マネージャー サービスがジョブ キューを監視します。独自に作成するか、BizTalkを使用してジョブ キューを監視し、オーケストレーションまたはワークフローを開始することができます。キューからタスクを 1 つずつ引き出し、タスクを実行し、DB 内のジョブのステータスを更新します。

問題は、ユーザーの数、ユーザーがキューに入れるタスクの数、および各タスクの許容量 (時間、メモリ、CPU など) に応じたスケーラビリティです。私があなたなら、1 分の時間の粒度を押し戻して、5 分に押し上げます。午後 1 時 40 分まで待てなくて、午後 1 時 38 分にやらなければならないことは何ですか? :)

于 2009-06-19T02:24:17.250 に答える
0

システムの性質によって多少異なります。イベントの完全な定義がデータベースに格納されているという仮定に基づいて作業します。

  • イベントが Web UI で何かを引き起こす必要がある場合は、更新時にテーブルで「発生」したエントリを確認し、適切な視覚的インジケータ/画面/ポップアップを次の Web 要求出力に追加します。
  • イベントがバックグラウンド処理に関連している場合、最も簡単な解決策は、新しいレコードのデータベース イベント テーブルをポーリングし、クロックをチェックしてどのイベントが発生したかを確認する別のスタンドアロン .NET アプリケーションを作成することです。一部のイベントが長時間実行されるプロセスなどを引き起こす場合は、凝ってスレッド化を含めることができますが、それが基本的な設計になります。(必要な場合にのみスレッドを使用してください...テーブルをポーリングする単純なシングルスレッドアプリが最も堅牢です)
于 2009-06-19T01:19:00.863 に答える
0

次に、データベーステーブルの主キーを含むイベント/ジョブをどこかに追加すると思います。イベントが発生するときは、データベースからその情報を取得して、ロジックを実行します。

一般的な解決策が何であるかはわかりませんが、車輪を再発明して、イベント時間にデータベースのクラスター化インデックスを作成することを考えているので、次のようなステートメントで毎分データベースをポーリングできます...

SELECT * FROM Events WHERE Events.Time < next_minute
于 2009-06-19T02:07:50.497 に答える