私は、包括的な友人/フォロワーデータを得るために、毎日いくつかのソーシャルメディアサイトにアクセスする必要があるasp.netサイトを開発しています. ホスティングとして arvixe ビジネス クラスを選択しました。将来、私たちが成長した場合は、専用サーバーにアクセスして Windows サービスを実行したいと思っていますが、現時点ではそれがカードにないため、スケジュールされたタスクを実行する別の信頼できる方法が必要です。app_code(global.aspx) からスレッド タイマーを実行することに慣れています。ただし、アプリ プールのリサイクルにより、タイマーでいくつかの問題が発生します。Quartz のようなタスク スケジューリングを使用したことはありませんが、stackoverflow でそれについて多くのことを読みました。私は自分の目標に近づく方法についてのアドバイスを探していました。どちらの方法を使用しても、API 呼び出しの制限により、定期的にクローラー スレッドを最大 1 時間スリープさせる必要があるという大きな問題があります。私の最初の考えは、データベースを使用してジョブの開始と終了を保存することでした。アプリ プールがリサイクルされるとき、完了していない部分をすべてクリアし、その日に実行された記録がない部分のみを開始します。ここの専門家はどう思いますか?このタイプのスケジューリングのサンプル アーキテクチャへの適切なリンクはありますか?
4 に答える
自分でロールするかクォーツを使用するかにかかわらず、どの方法を使用するかは問題ではありません。ASP.NET/IIS をホストしたいので、ASP.NET/IIS に翻弄されます。
スケジュールされたタスクを実行し、ホストされたデータベースにデータをアップロードするだけの予備のコンピューターはありますか? 正直に言うと、(ユース ケースによっては) そのようにしてから ASP.NET でスケジューラを実行してみる方がおそらく安全です。
永続的なジョブ ストア (データベースなど) を使用し、ジョブが途中で強制終了されるようなことを処理できるようにジョブを作成およびスケジュールする限り、IIS がプロセスをリサイクルすることはそれほど大きな問題ではありません。
より大きな問題は、トラフィックがない場合、IIS がサイトをシャットダウンすることです。サイトを維持できる場合は、失火ポリシーを適切に設定し、中断したところから再開するために必要な状態データをジョブが保存していることを確認してください。
言語にとらわれず、Linux でサポートされているお気に入りの言語で「ジョブ アクティベーション スクリプト」を書くことを気にしない場合は...
私にとって非常にうまくいった解決策の1つは次のとおりです。
- 比較的安価で安定した Linux ホスティングを (評判の良い企業から) 入手し、
- 定期的に実行したいロジック (RESTfully、SOAP、または XMLRPC のいずれか) を含む .Net ホスト プラットフォームで WCF サービスを作成します。
- 選択した言語 (私は PHP を使用) で記述された、Linux でホストされているcron ジョブを介して呼び出しを処理します。
私が言ったように、非常にうまく機能しています。VPS の費用がかからず、構成可能で外部から有効化されます。ジョブがアクティブ化される中心的な場所が 1 つあります。稼働時間は 99 ~ 100% です (失敗は一度もありませんでした)。
ブライアンの投稿にいくらか沿っています。
予備のコンピューターを見つけます。
DB アクセスを許可する代わりに、サイトで Web サービスを呼び出します。このサービス コールは、実行しようとしているプロセスのイニシエーターでなければなりません。パラメータを入れようとしないでください。「StartProcess()」のようなものだけで問題なく動作するはずです。
スリープして後で再開する限り、Workflow Foundationをご覧ください。状態を維持するための優れた組み込み機能がいくつかあります。
DB を外部に公開しないでください。代わりに、そのページまたは Web サービスを公開し、その周りに何らかのセキュリティをラップします。WCF には、そのための優れたセキュリティ機能が組み込まれています。
最良の部分は、移動することを決定したときに、Web サービスを保持し、同じ方法で Windows サービスから呼び出すことができることです。