.NETで時間ベース/スケジュールされたイベントを実行するにはどうすればよいですか?
-
06-07-2019 - |
質問
ウェブサイトで、アクション/イベントのスケジューリングを提供する必要があります。くだらない類推は、人がカレンダー項目を追加し、日付/時刻が「ヒット」になったときに、何らかのロジック(レポートの計算など)が実行されるカレンダーシステムです。
クライアントから入力された何百、何千ものスケジュールされたイベントがある場合があります。クライアントが何かを入力してスケジュールを取得したら、その情報をデータベースに保存します。次に、データベーステーブルの主キーを含むイベント/ジョブをどこかに追加すると思います。イベントが発生するときは、データベースからその情報を取得し、ロジックを実行します。完了しました。
これを処理する一般的なソリューションは何ですか?
.NET 3.5 SP1を使用しています。 DBはSql Server 2008です。ただし、UIはWebベースになります。
人々がMSMQを使用しているかどうかわかりませんでしたか?または、SQL Serverに何か組み込まれていますか?または、NTサービスを備えたオープンソースライブラリ( Quartz.NET など)。サーバーはWindows 2008 Standard Editionになります。
また、同等のcronジョブやコマンドラインスクリプトなどを使用することを提案しないでください。
最後に、これは二次的な目標です..これをシズや笑いのために紺ontoに投げ入れたいのですが...それも可能ですか?それはウィッシュリストのアイデアにすぎません。ソリューションがAzureを使用するよりも簡単な場合は、専用のボックスで行うことをお勧めします。
歓声:)
edit:イベントの発生が必要なときに処理するロジックは、バックグラウンドジョブです。 UIは不要です。
解決
Quartz.NETは、おそらくこれらの要件も非常にうまく処理できます。私が見る利点は、スケジューラ(CronTrigger +カレンダー)を設定するさまざまな方法と、テスト可能なコードの小さな単位(ジョブ)でジョブを実行できることです。
Quartz.NETは、クラスタリング機能を使用して必要な配布とフェイルオーバーも提供します。優れた機能の1つは、トリガーごとに設定可能なミスファイア処理の設定であり、ミスファイアとスケジューラーのダウンタイムに対応する機会を提供します。
SQL Service Brokerにはポーリングがないという利点があるように見えますが、それが問題になるかどうかは疑問ですが、ブローカーには少し複雑に聞こえるという欠点があります(少なくとも上記の説明から)。
バイアス0.02ドルだけ
他のヒント
Workflow Foundation はこれを実行できます。 遅延アクティビティを使用し、TimeSpanを(DesiredTimeOfExecution-Now)に設定します。 。大規模システムの場合、UnloadOnIdleをtrueに設定すると、保留中のワークフローは必要になるまで保持されます。
WFは無料で、.NET Framework 3.0の一部として含まれています。
必要なのはSQL Server Service Brokerです。
カレンダーデータなどを照会するために、時間制限付きのデータベースアクセスを実行できます。MSMQよりも強力なメッセージベースであり、ポーリングを必要とせず、必要に応じて分散環境で使用できます。私に最適です!
ストアドプロシージャを使用して、イベント情報をデータベース内のSSBキューに配置します。将来、そのメッセージを起動して、イベントデータを取得し、「外部アクティベーション」を行うピックアップキューに入れる別のストアドプロシージャを処理します。 EAは、コンソールアプリを指すWindowsサービスに通知を送信します。そのコンソールアプリは、ピックアップキューからイベント情報を取得します。これで、必要な正確な時間にイベントデータを取得できました。コンソールアプリで好きなように処理します。
学習曲線はありますが、SQL Service Brokerが提供する信頼性、柔軟性、およびスケーラビリティが必要な場合は、それだけの価値があります。以下は、開始するためのリンクです。
比較は次のとおりです。 SQL Service BrokerとMSMQ
SOでは、残念ながら1つのリンクしか投稿できません。それ以外の場合は、SSBの使用を開始するために役立つリソースを参照できます。
これがお役に立てば幸いです!
1つのオプションは、最もきめ細かい間隔で実行するSQLジョブを作成し、すべてのイベントを処理することです。
.NETとSQL Serverの両方の世界のベストを望むなら、 SQLジョブを使用し、マネージコードを呼び出します。私はこのソリューションの経験がないので、提供したリソースがあまり徹底的でない場合は事前に謝罪します。
タスクが非常に複雑で、SQL Serverにアセンブリをロードしたくない場合、またはスケジューリングシステムが気に入らない場合は、サードパーティスケジューラプラグインを備えた.NET Windowsサービスをお勧めします。個人的に、すべてのコードをストアドプロシージャまたは一連のストアドプロシージャに保持できる場合は、管理がはるかに簡単で、多くの作業が既に行われていると思うので、私は仕事をします。
編集
粒度について説明したコメントに気付きました。毎分実行する必要のあるアクションがある場合、.NETサービスソリューションは、おそらくある種のマルチスレッドソリューションを実装する必要があるため、おそらく簡単です。
粒度が小さく、特定の分に発生するすべてのジョブが次の分までに終了するかどうかを先験的に知る必要があるため、ジョブスケジューラとジョブマネージャーが必要になります。
これにより、スケジューラの仕事が簡単になります。ジョブを保存するDBテーブルがあり、毎分ジョブスケジューラサービスがそのテーブルにアクセスして、実行する必要があるジョブを選択する必要があります。
これらのジョブをジョブマネージャーでキューに登録します。別のテーブルまたはトランザクションキューを使用して、ジョブをエンキューできます。ジョブマネージャーサービスはジョブキューを監視します。独自にロールするか、 BizTalk を使用してジョブキューを監視し、オーケストレーションまたはワークフローを開始します。タスクを1つずつキューから取り出し、タスクを実行して、DB内のジョブのステータスを更新します。
問題は、ユーザー数、ユーザーがキューに入れるタスクの数、および各タスクが許可される集中度(時間、メモリ、CPUなど)に依存するスケーラビリティです。もし私があなただったら、1分の時間粒度を押し戻し、5分に押し下げます。午後1時38分に何をする必要がありますか午後1時40分まで待てないことにとって? :)
これはすでにStackOverflowで議論されている問題です。 asp.netのジョブスケジューラが必要
をご覧ください。質問に最も重要な情報を追加するのを忘れた-ASP.Net
サービスのように実行でき、定期的に呼び出されるメソッドを提供し、タイマーを使用してイベントをロードし、有効なものをキューに入れることができるメソッドを提供するASp.Net Webアプリのスケジューラフレームワークについて説明します。
また、これはすべての選択肢の中で最も安価です。これがあなたの必要なものであることを願っています。
システムの性質に少し依存します。イベントの完全な定義がデータベースに保存されているという仮定からの作業:
- イベントがWeb UIで何かを引き起こす必要がある場合、更新時に「発生」したエントリのテーブルを確認し、適切な視覚インジケータ/画面/ポップアップを次のWeb要求出力に追加します。
- イベントがバックグラウンド処理に関連する場合、最も簡単な解決策は、新しいイベントをデータベースイベントテーブルにポーリングし、発生したイベントを確認するためにクロックをチェックする独立したスタンドアロンの.NETアプリケーションを作成することです。いくつかのイベントが長時間実行されるプロセスなどを引き起こす場合、あなたは空想になり、スレッド化を伴うことができますが、それは基本的な設計です。 (必要な場合にのみスレッドを使用してください...テーブルをポーリングするシンプルなシングルスレッドアプリが最も堅牢です)
その後、データベーステーブルの主キーを含むイベント/ジョブをどこかに追加すると思います。イベントが発生するときは、データベースからその情報を取得し、ロジックを実行します。
一般的なソリューションが何であるかはわかりませんが、車輪を再発明して、イベント時間にデータベースクラスター化インデックスを作成することを考えているので、...
SELECT * FROM Events WHERE Events.Time < next_minute