2

ASP.NETアプリとワーカーロールの両方を設定しましたが、それらの間でどのように通信するのでしょうか。ソリューションは地理的に異なる場所に分散されるという考えだと思います。では、分散したワーカーとWebの役割を簡単かつ効率的な方法でリンクするにはどうすればよいでしょうか。私はWCFを調べ始めましたが、私にはやり過ぎで複雑すぎるように見えます。私が持っていたもう1つの考えは、Workerロール内でSignalRクライアントを使用して、Webロール内のサーバーと通信することでした。

編集:

正確なコンテキスト:

1)ユーザーがファイルをサーバーにアップロードする

2)サーバーはファイルをAzure Storageに送信し、ファイル名をCloudQueueに追加します

3)ワーカーはCloudQueueからファイル名を取得します

4)ワーカーは、Azure Storageからファイルを取得し、その処理を開始する新しいスレッドを開始します

5)ワーカー/スレッドは、ファイル処理のすべてのステップでアプリケーションにレポートを返します

6)アプリケーションはレポートを受信し、SignalRを使用して処理ステップをクライアントのブラウザーにリアルタイムで転送します。

私が見逃しているのは、ステップ2> 3です。新しいファイルが到着したことをワーカーにすぐに通知するにはどうすればよいですか?CloudQueueをポーリングすると、遅延が発生するため、ポーリングしたくありません。また、ステップ5> 6では、ワーカーはステップについてアプリケーションに通知する必要があり、これは遅滞なく行われる必要がありますが、このような場合にポーリングソリューションをどのように使用できるかわかりません。

4

3 に答える 3

1

上で述べたように、もう少しコンテキストが必要です。基本的に、WindowsAzureキューとWindowsAzureサービスバスキュー/トピックの2つの主要なオプションがあります。私の個人的なアドバイスは、Webとワーカーの役割が同じリージョンに同じ場所にある場合はAzureキューを使用し、そうでない場合はServiceBusキューを使用することです。Webとワーカーの役割を一緒に配置しない理由を尋ねる必要があります。アプリを地理的に展開している場合は、米国、ヨーロッパ、アジアなどの各地域ですべてのWebの役割と作業の役割を展開してからトラフィックを使用することを検討してください。ユーザーを最適な地域にルーティングするマネージャー。

どのキューをいつ使用するかについての優れたブログ投稿があります'WindowsAzureキューとWindowsAzureサービスバスキュー-比較と対照':http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx

HTH

編集

Webとワーカーロールのコミュニケーションのための良いアプローチは以下のとおりです(@smarxが回答した最近のスレッドからこれを盗みました)

1 Webロールは、ジョブIDを含むメッセージをキューに書き込みます。

2ワーカーロールが作業を行い、結果をパーティションキーを使用してテーブルに書き込みます。

3 Webロールは、テーブルのその行をポーリングしています。それが存在すると、答えが戻ってきます。

あなたの場合、ワーカーロールにステータスの更新でテーブルストレージを更新させてから、Webロールにそれらを取得させてユーザーに表示させることができます。例:20%、50%、完了など...

Webロールから十分にポーリングしている限り、このタイプの通信に遅延は実際には見られません(*トランザクションコストに注意してください)

ステータスの更新のために、ここで何らかの役割間通信を行うことができると思いますが、IMOはやり過ぎかもしれません。

http://msdn.microsoft.com/en-us/library/windowsazure/hh180158.aspx

于 2012-08-21T22:48:43.620 に答える
0

Command QueryResponsibilitySegregationの略であるCQRSを確認することをお勧めします。

このアーキテクチャの目的は、緩く結合され、拡張可能で、スケーラブルなシステムを作成することです。

http://cqrsjourney.github.com/

Greg Youngがこのシステムを発明し、分散型のスケーラブルなシステムの構築を促進するために利用できるオープンソースの実装がいくつかあります。彼の前には、基礎を築いたバートランド・メイヤーがいました。

過度に単純化された概念は、一連のキューがWebロールとワーカーロールを分離することです。したがって、ユーザーがWebロールから作業を送信すると、その作業はキューに入れられ、後でワーカーロールによって取得されます。トレードオフは、即時の一貫性ではなく、最終的なデータの一貫性があることです。利点は、疎結合でスケーラブルであることです。キューが大きくなりすぎた場合は、追加のスケールを処理するために追加のワーカーロールを追加できます。

このアプローチでは、コマンド、クエリ、ドメインオブジェクトなどの概念を使用します。CQRSは、あなたが求めていると思う目標を達成するための非常に強力な方法になりつつあります。

検索エンジンはあなたに多くの良いリソースを与えることができます。ここにいくつかの便利なビデオがあります:Greg Young http://www.youtube.com/watch?v=KXqrBySgX-s My Friend Rinat http://www.youtube.com/watch?v=CnvO_nlvrps

幸運を!

于 2012-08-22T03:25:24.003 に答える
0

私は、ワーカーの役割とWebの役割の間で通信する場所として紺碧のテーブルストレージを使用しました。基本的に、ワーカーロールはメッセージ/通知をAzureテーブルに格納し、Webロールには、Azureテーブルの変更を定期的にチェックするタイマーがあります。その後、WebロールはSignalRを使用してメッセージをクライアントページにリアルタイムで送信し、進行状況を報告します。

Global.asax.csファイル:

private static System.Timers.Timer _timer;

protected void Application_Start()
{
     //Start the timer job
     _timer = new System.Timers.Timer(3000);
     _timer.Elapsed += new ElapsedEventHandler(WebRoleTimerJob);
     _timer.Start();
}


/// <summary>
/// This event will be fired intervally every 3 seconds to broadcast messsage to all registered client pages using SignalR
/// </summary>        
public static void WebRoleTimerJob(object sender, ElapsedEventArgs e)
{               
      // Here, you can read Azure table storage to detect any changes    
      // or notification from Worker role
      // ....

      //If there is any changes, then broadcast message 
      // to all relevant client pages using SignalR   

      var context = GlobalHost.ConnectionManager.GetHubContext<Hub>();       
      context.Clients.All.addNewMessageToPage("your_message_name", "message_content");
}
于 2015-04-01T15:23:11.443 に答える