2012-04-15 9 views
8

私はシンプルなasp.net Webコントロールを組み立てています。これは、ajaxフォームの投稿の結果、MSQLデータベースにレコードを挿入するためです。Web層とデータベース層をMSMQ経由でデカップリングする必要がありますか?

このコントロールを含むページでは、小さな時間内に何千ものヒットが発生する可能性があります。データベース接続を開いてレコードを挿入し、各リクエストごとに接続を閉じるというパフォーマンスの問題が心配です。

私に起こった解決策は、WebコントロールがメッセージをMSMQキューに入れ、サーバー上のWindowsサービスにキューを定期的に読み取り、バッチ挿入を実行させることです。

Webサーバーとデータベースサーバーが同じマシン上で実行されていることを考えれば、賢明なアーキテクチャーのように聞こえますか?それは必要なのですか?

私がデータベースで読んだことから、MSMQを使用する利点のほとんどは、パフォーマンスではなく復元力と関係しているため、誤ったツリーを吠えている可能性があります。

が何かアドバイスは非常に感謝して

感謝

ピート

答えて

10

をいただければ幸い処理は、このようにオフラインを要求しますが、大量のリクエストを扱っているときのための一般的なパターンです。

これを行う必要があるかどうかは、いくつかの要因に基づいています。

主な要因は、発信者がリクエストに対する応答を同期して確認する必要があるかどうかです。

呼び出し元は、コール応答の一部としてデータが正常にコミットされたかどうかを、即座に確実に知る必要がありますか?もしそうなら、要求処理をオフラインにすることは本当にオプションではありません。

しかし、発信者が自分の要求がオフラインで処理され、必要な応答もオフラインで送信されたという応答を送信できるのであれば、キューを使用することは間違いなく全体的なアーキテクチャに役立ちます。

利点は、フロントエンドの可用性の問題です。

短期間に何千ものリクエストを処理していて、各リクエストがスレッドによって処理されてデータベースにデータを挿入する場合、ディスパッチャスレッドが存在しない問題に遭遇する可能性がありますサービス受信要求。

しかし、IISがやっているバックエンドの作業量を減らすことによって(ローカルキューへの書き込みはデータベース呼び出しに対して非常に安い)、可用性に基づく失敗の可能性も低減します。

キューを使用することで、バックエンド処理のスループットを制御できるため、バックエンドトラフィックを抑制することができます。

たとえば、リクエストをデキューしてデータベースに処理するシングルスレッドキューリーダープロセスを使用できます。キューにメッセージが蓄積されている場合は、そのインスタンスをさらにホストすることによってキューリーダーサービスをスケールアウトできます。

これは、一度にデータベース上のアクセススレッドの数をより詳細に制御できるため、データベースの競合の問題が発生する可能性を減らすことを意味します。

このように、キューイングを使用することで、障害が少なく、管理オーバーヘッドが低くなります。これは、よく書かれたアプリケーションの特徴です。これは、特にあなたのWebサーバー上であなたのデータベースをホストすることを検討しているときに!

また、CQRSと呼ばれるアーキテクチャパターンの読み込みが必要です。このパターンの中心は、データベースへの書き込みをオフラインで行うことです。

+0

クラッキングの回答ヒュー、大変ありがとうございます。私が疑っていることを確認して、もっとたくさん!オプションの大きな比較と説明のために –

+0

+1。どうもありがとうございました。 –

2

非同期アーキテクチャには多くのメリットがありますが(Hughによって確認されていますが)、それに伴うコストと複雑さは間違いありません。注意深く調整する必要があります。2つのコンポーネント(WebアプリケーションとDB)から、4つのコンポーネント(Webアプリケーション、DB、バッチサービス、MSMQ)を開発、保守、監視する必要があります。あなたは、WebサーバとDBサーバは、あなたの性能要件を考慮して、同じマシンであると言っています。明日あなたは、Webアプリケーション、バッチサービスとDBをホストする必要があります3つの別のマシンです。現在、MSMQにはネットワークも含まれています。間違っているかもしれないもう一つのこと。 マルチスレッドバッチプロセッサも簡単ではありません。生成されたシーケンスで各メッセージを処理する必要がある場合(少なくとも特定のエンティティの場合)、ロジックは複雑になります。

可能であれば、両方の解決策を測定し、決定します。

+2

私は監視オーバーヘッドであなたのポイントを取る、はい、監視することがさらにあります。しかしながら、そのアプローチがより複雑であることを完全に否定する。高度の結合度を持つソリューションは、展開と保守がより複雑です。移動部品が多いにもかかわらず、疎結合のソリューションは簡単です。各部には明確な責任があります。また、マルチスレッド・バッチ・サービスは必要なく、単一のスレッド・キュー・リスナー・サービスです。スケールアウトは配送の順序に影響することに同意するが、これは避けられないものである。また、MSMQはWindowsのサブシステムの一部であり、 "開発"する必要はありません。 –

関連する問題