0

Windows azure cloud service用のアプリケーションを開発しています。

アプリケーションの一般的な説明は非常に単純です。MVC 4 のフロント エンド、フロントエンド処理要求を処理するための中間層、および SQL Azure/Blob バックエンド...

私はまだコードを書き始めていません。その前に、次のシナリオのどれがよりスケーラブルなモデルであるか、またその理由についてフィードバックを得たいと思います。私が考慮しなかった N 番目のオプションがあると思われる場合は、それを公開してください。

明確にするために、単一層アプリは論外です。

シナリオ 1:
フロントエンドは、すべての処理を行う中間層で WCF サービスを使用します。

シナリオ 2:
フロントエンドは、SB でその要求をキューに入れ、待機する中間層で WCF サービスを消費します。「Tier 3」はメッセージを消費して処理し、WCF サービスが応答するための回答をキューに入れます...

シナリオ 3:
フロントエンドがメッセージをキューに入れ、ループして応答メッセージを待ちます。「Tier 3」はメッセージを消費して処理し、フロントエンドが待機を停止するために再キューイングします...

基本的に、すべての質問は「WCF の水平方向のスケールアウトはどの程度ですか?」に続きます...

4

3 に答える 3

1

メッセージングは​​、メッセージを消費して処理するワーカーをいくつでも構成できるため、常に最もスケーラブルなソリューションです。

ただし、UI を同期的に動作させたい場合は、非同期処理への切り替えは簡単ではありません。通常、ユーザーへの即時のフィードバック (または偽のフィードバック) がないタスクベースの UI に切り替えます。

クエリ、ドメイン イベント、およびコマンドを使用してスケール アウトする方法についてブログに書いています

于 2013-02-28T14:43:57.647 に答える
1

最もスケーラブルなソリューションは、あなたが除外したソリューションです。つまり、ノードを好きなだけ持つことができる共有状態のない単一層の Web アプリです。ロード バランサーの背後にあるn 個の Web サーバーとm 個の分散データベース ノードほどスケーラブルなものはありません。最もスケーラブルなアーキテクチャを除外したため、おそらくスケーラビリティを求めていないため、間違った質問をしています。おそらく、可用性などの他のアーキテクチャの原則を見ているでしょう。

複数のサービス間で機能を分離するのはなぜですか? 多くの理由があります。非同期処理により、可用性が向上します (キューに書き込み、障害を気にしないことにより)。また、データベースなどのボトルネックを管理することもできます。また、開発、展開を容易にするために、アプリケーションをサービスに分割します。したがって、可用性、保守性、セキュリティ、パフォーマンス、展開性、コスト、使いやすさ、テスト容易性、コンプライアンス、またはその他の何かを求めている可能性があります。スケーラビリティ ハンマーをつかむ前に、その質問に自分で答える必要があります。私は、これらの難しい質問を問いかけ、それに答えるために、特にCALMを作成しました。

質問の詳細に戻ります。Windows Azure で一般的にスケーラブルな (それが本当に必要な場合)事実上の非同期処理パターンには、WCF が含まれていません。WCF には特定の理由がありますか? WCF と Service Bus が必要でない場合、不必要に複雑になるため、良いものである必要があります。Windows Azure では、(MVC アプリをホストする) Web ロールを使用して非同期処理を実装し、Windows Azure キューにメッセージを配置します。これらはワーカー ロールによって処理されます。クライアント (ブラウザー) に結果を知らせる必要がある場合は、CQRS パターンを手動でロールするか、他の人が言及したように SignalR を使用できます。私はWCFを取り除くことを真剣に考えています。

あなたのシナリオに関して:

シナリオ 0: ステートレス Web サーバーがすべての処理を行い、分散データベース ノードと直接通信します。これは最もスケーラブルですが、他にも欠点があります。

シナリオ 4: フロント エンドがメッセージを Azure キューに配置し、結果をクライアントに返します。Worker ロールはメッセージを処理し、結果をどこかに置きます(テーブル ストレージまたは BLOB)。ブラウザの Javascript は結果データをポーリングし、「完了」するとクライアントに提示します。これはCQRSっぽいです。(ダンリーの答え)

シナリオ 5: フロント エンドがメッセージを Azure キューに配置し、結果をクライアントに返します。ワーカー ロールはメッセージを処理し、結果を SignalR 経由でクライアントに送信します。(jgauffinの答え)

シナリオ5の方がいい

于 2013-02-28T20:19:46.160 に答える
1

フロントエンドの要件が何であるかは言いませんでした。これは、データによる応答を期待する Web サイトですか? 通常、メッセージ キューイング パターンは、要求を処理するための多くのオプションがあるため、よりスケーラブルになります (ただし、高速ではありません)。ただし、その道をたどると、いくつかのトリックなしでは、ユーザーに直接同期のようなフィードバックを取得することは難しくなります (ここでは SignalR が選択される可能性があります)。

価値があるとすれば、私はクラウドで CQRS パターンを使用する傾向があります。これは、必要に応じて適切にスケーリングされるからです。コマンドが非同期で処理され、ユーザーが同期応答を取得しないという事実に対処する必要があります。その場合、UI はそれに対処する必要があります。ステータス付きのコマンド処理テーブルを使用します。Web (この場合はクライアント) は、そのテーブルをポーリングして、コマンドがいつ完了したかを把握し、結果をクライアントに表示するタイミングを知る必要があります。私たちにとって、これは、探しているスケール (および CQRS のその他の利点) を得るための価値のあるトレードオフです。

于 2013-02-28T16:32:26.160 に答える