System.Messaging
このタスクにはMSMQ ( ) の使用を検討してください。おそらく次のような流れです。
- ユーザーが Web サイトにデータをアップロードします。
- データは MSMQ に書き込まれます。
- 間隔nで、Windows サービスは次の待機中のメッセージをキューからピーク/読み取ります。
- 作業はサービスによって行われ、データが DB に書き込まれ、顧客に通知するために別のメッセージが別のキューに送信されます。
- 別のサービスが 2 番目のキューからピーク/読み取りを行います。必要に応じて顧客に電子メール/通知を送信します。この 2 番目のキューは、SMTP の停止などを処理するために必要であり、1 番目のキューとは別に管理できることを提案します。
潜在的な障害に関する他の懸念は、さらに別のサービスである可能性や、Web サイトのポーリング メカニズムである可能性があります。最後に処理されたメッセージの日時の DB を読み取ります。「待機中」の項目数を読み取ります。数が満足のいくものでない場合は、管理者/顧客/などに電子メールを送信してください。必要に応じて。
MSMQ を使用すると、プル システムを使用できるようになり、データベースに対してnごとにポーリングすることで、データベースとネットワークに負担をかける必要がなくなります。メッセージ送信はすべてトランザクションであるため、メッセージの紛失や未承認について心配する必要はまったくありません。
@ジェス:ベースをカバーしようとしていることを理解しました。適切なキューは、リクエストでデータベースを叩かないという点で役立ちます。これが問題になるかどうかは、アプリ/プロジェクト/顧客の規模によって決まります。実際、これをすべて Page_Load の 1 つの .aspx に入れることもできましたが、よく知っているはずです。
Re:やり過ぎ。ダウンタイムについていくつかの懸念があり、そのようなアプリがこれをどのように処理できるかという質問を「読みました」。すぐに使用できる Web サービスは、次のことを行いません。
この推奨される解決策には、次のものが含まれます。
MSMQ には独自のストレージ実装があるため、キューイングと配信順序についてアプリ データベースに依存しません。これは Windows の一部であり、サービスとして実行されます。MSMQ がダウンしている場合は、Windows がダウンしているか、セキュリティが正しく構成されていません。
非同期処理。Web 層は、単純に要求を「キャッチ」し、キューに「入れる」ことができます。それでおしまい。スレッドのスピンアップやアプリケーション データベースへの依存はありません。他のユーザーからの要求を受信するジョブに戻ることができます。ユーザーは忙しい一日の遅れを「感じる」必要はありません。
スケーラビリティ。Windows サービスを 1 台以上のマシンに展開して機能させることができます。
作業の分離: 401k 処理、電子メール送信、要求処理 + 認証はすべて個別のモジュールで行われます。
セキュリティ - これがイントラネット ソリューションかインターネット ソリューションかは 100% 明確ではありません。インターネットに公開されている場合は、DMZ から内部アプリケーションにメッセージを送信する方法を検討してください。オープンなインターネットからアプリケーション DB への読み取り/書き込みアクセス権を持つことを正当化できますか? ある種のファサードを考えてみましょう。キューはこれを提供します。