2009-08-26 25 views
9

私は現在、最終的にWindows Azureに移行するアプリケーションを設計しています。しかし、短期的には、それは自分自身をホストするサーバー上で実行されます。メッセージキューのための良い戦略?

このアプリケーションには、いくつかの個別のWebアプリケーションが含まれています。これらは、基本的にデータを受信するWCFサービスと、ユーザーがデータを管理するサイトです。さらに、さまざまな方法でデータを処理するバックグラウンドで実行されるワーカーサービスが必要になります。

私は非常にデカップルアーキテクチャを使用してこれに熱心です。理想的には、コンポーネント(つまり、Webアプリケーションやワーカーサービス)が互いにできるだけ知りたくないと思っています。メッセージキューを使用することが最善の解決策になるようです.Webアプリケーションは、作業単位を含むメッセージをキューにエンキューすることができ、ワーカーサービスはそれらを取り出して必要に応じて処理することができます。

しかし、私は最終的にはAzureに移行し、私が実行する必要がある再作業の量を最小限に抑えたいということを心に留めて、これを行うための技術を試してみたいクラウドに移行します。 Azureには、私のニーズに最適なQueueコンポーネントが組み込まれています。私がしたいのは、これをできるだけ近く模倣するものを作り出すことです。

は いくつかのオプション(私はSQL Server 2005のバックエンドで、Windows上で.NETを使用しています)があるように見えます

- 私がこれまでに発見したものは以下のとおりです。

  • MSMQ
  • SQL Serverサービスブローカー
  • データベーステーブルを使用して独自のローリングして、いくつかの保存されprocsの

誰もがこのための任意の提案を持っている場合、私は思っていた - あるいは誰もが似た何もしてとするものにアドバイスを持っている場合する/しないでください。私はすべての状況が異なることを認識していますが、この場合、私のキューイングの要件はかなり一般的なものだと思いますので、これを行う最善の方法についての他の人の考えを聞きたいのです。事前に

おかげで、

ジョン

答えて

18

あなたは心の中でアズールをお持ちの場合はAPIとsemnaticsは、AzureのキューとMSMQまたはSSBのいずれかの間で大きく異なっているとして、おそらくあなたは、Azureの上でまっすぐに開始する必要があります。

SSB対MSMQの迅速な3048メートルの比較(それは本当にあなたがそれを実装する方法によって異なりとして、私は比較のうち、カスタムテーブルとしてキューを残しておきます...)

  • 展開 :MSMQはWindowsコンポーネント、SSBはSQLコンポーネントです。 SSBでは、SQLインスタンスに任意のメッセージを格納する必要があるため、分離されたクライアントはインスタンスにアクセスする必要があります(Expressでもかまいません)。 MSMQでは、クライアント上にMSMQを展開する必要があります(OSの一部ですが、オプションのインストール)。
  • プログラマビリティ:MSMQは完全にサポートされたWCFチャネルを提供します。 SSBは実験的なWCFチャネルのみを提供しますhttp://ssbwcf.codeplex.com
  • パフォーマンス:SSBはトランザクションモードでMSMQよりも大幅に高速です。
  • クエリーの可能性:SSBキューはSELECTE-ed uppon(任意のメッセージ、完全なSQL JOIN/WHERE/ORDER/GROUPの出力を表示できます)、または非トランザクションモードで動作させると高速になります。 (次のメッセージのみ)
  • リカバリ可能性:SSBキューはデータベースに統合されているため、データベースでバックアップされ、リストアされ、アプリケーション状態に合った状態が維持されます。 MSMQキューはNTファイルバックアップサブシステムにバックアップされるため、バックアップを同期させる(一貫性を保つ)ために、キューデータベースをサスペンドする必要があります。
  • 取引(すべてのエンキュー/デキューは、常にデータベースの更新を伴うであるため):SSBが完全にそうデキューとエンキューSQLに統合されたローカルトランザクション操作です。 MSMQは別のTM(トランザクションマネージャ)であるため、トランザクションにSQLとMSMQの両方を登録するには、キュー/デキューを分散トランザクション操作にする必要があります。
  • 管理とモニタリング:どちらも同等です。ツールはまったくありません。
  • 相関メッセージ処理:SSBは、組み込みのConversation Group Lockingを介して、相関スレッドによる相関メッセージの処理をブロックできます。
  • イベントドリブン:SSBにはActivationストアドプロシージャを起動するのに、MSMQはWindows Activationサービスを使用します。類似。 SSBはWAITFOR(RECEIVE)とMAX_QUEUE_READERSのやりとりのやり方による自己ロードバランシング機能を備えていますが、
  • 可用性:SSBは、SQL Serverの高可用性の話にピギーバックして、クラスタ化された、またはデータベースのミラーリング環境で動作します。 MSMQは、Windowsクラスタ化の話だけに乗ります。データベースミラーリングは、HAソリューションとしてのクラスタリングよりもはるかに安価です。

はまた、私は、彼らが提供SSBとMSMQは原始oftheレベルで大きく異なることを追加したい:SSBプリミティブは会話で、MSMQプリミティブはメッセージている間。 TCP対UDPのセマンティクスを考える。

+0

ありがとうございました!それはとても役に立ちます。私たちの目的にとってはMSMQがより良い選択肢かもしれないようです - 私はMSMQをAzure Queuingと比較することに大きな一歩を踏みます。たとえば、Azureはメッセージが順番に(または一度だけ)配信されることを保証しないので、対応する動作が何であるかを確認するためにMSMQに対してこれをチェックする必要があります。しかし、これももう一度感謝します。これは非常に有益な比較です。 – John

10

あなたのために働く、またはあなたの環境により適したキューバックエンドを選択してください。 @RemusはMSMQとSSBを比較しています。 MSMQは実装するのが容易になるだろうが、いくつかの顕著な制限があるが、SSBはスペクトルの反対側で非常に重く感じるだろう。

は、あなたのアプリケーションからのリワークを最小限に抑えるために、それはあなたの道
持って、抽象キューはインターフェイスの後ろにアクセスし、その後、あなたが最終的に一緒に行くことにしたキューの輸送のための実装を提供します。 Azureや別のキュー転送に移行するときには、インターフェイスの新しい実装を提供するだけです。

アプリケーションから一貫した使用可能なAPIを得るために、キューと対話する方法のセマンティクスを制御できます。

目安は次のようになります。

interface IQueuedTransport 
{ 
    void SendMessage(XmlDocument); 
    XmlDocument ReceiveMessage(); 
} 

public class MSMQTransport : IQueuedTransport {} 
public class AzureQueueTransport : IQueuedTransport {} 

あなたはあなたのニーズを満たしているだけで何、BE-すべてのキューイング輸送を構築することはできません。 Xmlで作業する場合は、xmlを渡します。バイト配列で作業する場合は、バイト配列を渡します。:)

幸運!
Z

0

Win32 Mailslotsを使用してください。単一のサーバーで信頼性が高く、実装が簡単で、余分なソフトウェアを必要としません。

関連する問題