2012-03-14 8 views
2

自動メールを送信する必要があります。彼らは確実にディスパッチする必要があるので、データベースに書き込んでいます。同時に、Application_Startで開始されたSystem.Threading.Timerは、30秒ごとにメソッドを呼び出してデータベースから読み出し、送信されたエントリを削除して送信します。これは長時間実行されるタスクとしては発生しません。 db-queueをクリアするプロセスが非同期メソッドを使用するように注意が払われているので、送信/キューイングのフェーズはブロックされず、プロセス全体がshort-livedメソッドで実行されます(ThreadPool)。アプリリサイクルのコストも最小限に抑えられます(おそらく、1つのメールを再送することになります...問題ではありません)。メールキューをアプリケーションプールで実行するのは間違っていますか?

従来の知恵は、Webアプリケーションでこれを実行するとそれほど良くないと言い、サービスにこれをスピンアウトする必要があります。

書き込みサービスはPITAです。私はむしろそれを避けたい。だから私はなぜ私は効率的な非同期メールキューを私のアプリケーションプールで実行しないでください?誰でも私を啓発することはできますか?

+0

データベースに、特定のメールが受信され、送信中であることを何らかの形で示していますか?そうでない場合は、複数のWebサーバーで実行する予定ですか?上記の回答が「いいえ」と「はい」の場合、両方のサーバーが同じバッチの電子メールを同時に送信しないようにする必要があります。 –

+0

@ChrisShain、私はこれを認識しており、サイトがサーバーを超えて進化した場合にアーキテクチャを変更します。 – spender

+0

タイマーを守って、私は私のプログラムのために同様のタイマーの仕事をしていて、最後の4年間はうまくいきました。全く問題はなく、私は2日間のスレッドとタイマーで2日間の作業をします。 http://msdn.microsoft.com/en-us/magazine/cc164015.aspx – Aristos

答えて

2

サイトが使用されていない場合、アプリケーションプールは開始されず、メールは送信されません。

+0

それは本当です。非アクティブの後にアプリケーションプールをシャットダウンするタイムアウトを削除することがどれほど悪いのだろうか?私たちは問題のマシンで動作する唯一のアプリです。 – spender

+0

私はタイムアウトを削除するとすぐに問題を考えることはできません。あなたのサイトがまれにしか使用されていないため、再起動の心配が必要な場合は、再起動のようにアプリケーションプールがシャットダウン/再起動される他のケースについて考える必要がありますが、サイトは自動的に起動しません。定期的にサイトにpingを行う外部ウォッチドッグを考えてください。サイトのGETページだけが行うローカルのスケジュールされたタスクさえも考慮してください。 –

+0

そのほとんど不可能なサイトは使用されない - グーグルは毎秒ほぼすべてのサイトを読む。 – Aristos

1

ライティングサービスは、私はそれは主観的だと思いPITA

です。しかし、それをサービスに入れることは有益だろうと思いませんか?実装を変更したい場合は、私の経験では、より小さい個別のコンポーネントを維持するのがずっと簡単です。あなたがすべてのものを1つの場所に持っていると、それは通常PITAになります。

すでに電子メールをデータベースに書き込んでいます。単にデータベースをスキャンして電子メールを送信するシンプルなWindowsサービスを作成するのは非常に簡単です。私はこれが理想的ではないかもしれないことは知っていますが、SOや他の場所に浮かんでいる多くの例があります。あなたはすべてのファンシーを取得し、ESBを使用する必要はありません(あなたがしたい場合を除きます)。

最終的には、の場合がありますので、とする必要はありません。コストとメリットを比較検討する必要があります。

関連する問題