2011-08-18 9 views
3

私はMSMQについて学び、別のクライアントアプリケーションによって処理される、消費者向けのASP.NET MVC Webサイトからの電子メールとテキストメッセージを待ち行列に入れることに成功しています。SQL Serverインサート用のバッファーとしてのMSMQ

SQL Serverデータベースが不足している場合、ドライブや壊れたデータベースの展開中に、ローカルMSMQキューにタイムクリティカルでない挿入をキューイングして稼働時間を改善するのが適切でしょうか?

データベースを変更しながら理論的には、キュー処理(永続性)を一時停止/再開できます。誰かこれを試したことがありますか良い方法がありますか?

+0

SQLサーバーのバッファとしてMSMQを使用することは、一般的な実装です。 –

答えて

3

私は配信保証の目的でこれを実装したチームに所属していました。 MSMQを使用して、要求をデキューして挿入を実行した独自のサービスを実行していたデータベースサーバーに挿入要求を転送し、メッセージを確認して配信を確保しました。それは今、1年以上続いています。なぜそれがうまくいかないのか理解できないように頼まれたことはありません。

+0

どのようにクエリを保存しましたか?リスナーに引っ張られているだけの "INSERT INTO ..." –

+0

この情報を格納したカスタムメッセージクラスを作成しました。これらのメッセージクラスは、保証された配信技術を使用してMSMQトランスポートを介して送信されました。 DBサーバーには、MSMQリスナーがキューから取り出して挿入を実行しました。 –

+0

「キューから取り出したMSMQリスナー」について説明してください。 – cja

1

これはアプリケーションによって何がどのように行われるかによって異なりますので、これは主観的です。一般に、MSMQのようなものはこの目的では使用されず、選択したデータベースで何らかの高可用性クラスタリングを設定する必要があります。データベースが完全に停止することはほとんどありません。ほとんどの場合、DBがダウンしている間に何らかの理由で入力されたデータを保存するだけでなく、大部分のLOBアプリケーションにとって大きな問題です。

考えてもオーバーヘッドがあります。データベースへのINSERT操作は比較的高速です(より大きなスキームで)。シリアライズされた何かをキューに入れて何かを受け取って、その操作を挿入するとアプリケーションに大量の遅延を追加することになります。今はすべてが非同期です。

MSMQ は、アプリケーションの一端から別の端に物事を確実に届けるために使用されるため、このシナリオが望ましい場合があると思います。たいていの場合、DBを信頼し、MSMQを使用して非同期処理を有効にし、プロセス間通信とマシン間通信を行うほうがよいでしょう。

4

ローカルでキューに入れて高可用性を検討している場合は、Service BrokerをIIS/ASPインスタンスと一緒に配備したSQL Expressインスタンスに配備する必要があります。 MSMQでSSBを使用する利点は、メッセージストアとデータストア(1つの一貫したバックアップ/リストア、1つの一貫性のあるフェールオーバーユニット)間で一貫性があり、MSMQよりも大幅に拡張され、 - DTCを使用してMSMQデキューとDB挿入(デキュー/挿入に1つのローカルDBトランザクションを使用できます)、ペンディングメッセージ(SELECT .. FROM queue)のクエリ可能性を提供し、DB HA/DRソリューションと統合します(クラスタフェールオーバー/ミラーリング)、あなたはDBにactivationが含まれていて、それは使い慣れたT-SQLプログラミング環境からすべて機能します。 MSMQの主な利点は、クライアント側のC#/ .Net APIのサポートです。

+0

ローカルSQL Expressへのエンキューは、リモートSQL Serverとトランザクション上の整合性をとることができませんでした。これには、多くの高可用性ソリューションに適合しないDTCが必要です。 – usr

+0

@usr:SSBは各端(SEND、RECEIVE)でトランザクション的に一貫していますが、メッセージングアプリケーションはさまざまな手段で一貫性を実現します。 http://cs.brown.edu/courses/cs227/archives/2012/papers/weaker/cidr07p15.pdfをお勧めします –

関連する問題